SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy(sai Pie๋กœ ๋ฐœ์Œ)๋Š” C ๋ฐ Fortran ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จํ•˜๋Š” numpy ๊ธฐ๋ฐ˜ ์ˆ˜ํ•™ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. SciPy๋Š” ๋Œ€ํ™”ํ˜• Python ์„ธ์…˜์„ MATLAB, IDL, Octave, R ๋˜๋Š” SciLab๊ณผ ๊ฐ™์€ ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ ๊ณผํ•™ ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” scipy.optimize ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์˜ ์Šค์นผ๋ผ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ˆ˜ํ•™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ์•ฝ ์—†๋Š” ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋ฏธ ๋‹ค์Œ์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ธฐ์‚ฌ. scipy ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์ตœ์‹  ๋„์›€๋ง์€ help() ๋ช…๋ น, Shift+Tab ๋˜๋Š” ๊ณต์‹ ๋ฌธ์„œ.

์†Œ๊ฐœ

scipy.optimize ํŒจํ‚ค์ง€์˜ ์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™” ๋ฌธ์ œ์™€ ์ œ์•ฝ ์—†๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. minimize(). ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ณดํŽธ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฏ€๋กœ, ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ์ด ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์—ฐ๊ตฌ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.
์ ์ ˆํ•œ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. minimize(..., method="").
์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์˜ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • trust-constr โ€” ์‹ ๋ขฐ ์˜์—ญ์—์„œ ์ง€์—ญ ์ตœ์†Œ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์œ„ํ‚ค ๊ธฐ์‚ฌ, ํ•˜๋ธŒ๋ ˆ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ;
  • SLSQP โ€” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ˆœ์ฐจ XNUMX์ฐจ ๊ณ„ํš๋ฒ•, ๋ผ๊ทธ๋ž‘์ฃผ ์‹œ์Šคํ…œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‰ดํ„ด ๋ฐฉ์‹. ์œ„ํ‚ค ๊ธฐ์‚ฌ.
  • TNC - Truncated Newton ์ œ์•ฝ์ด ์žˆ๊ณ  ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋…๋ฆฝ ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ๋น„์„ ํ˜• ํ•จ์ˆ˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์œ„ํ‚ค ๊ธฐ์‚ฌ.
  • L-BFGS-B โ€” Broydenโ€“Fletcherโ€“Goldfarbโ€“Shanno ํŒ€์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ํ—ค์„ธ ํ–‰๋ ฌ์—์„œ ๋ฒกํ„ฐ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ์ค„์ด๋„๋ก ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ‚ค ๊ธฐ์‚ฌ, ํ•˜๋ธŒ๋ ˆ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ.
  • COBYLA โ€” ์„ ํ˜• ๊ทผ์‚ฌ๋ฅผ ํ†ตํ•œ MARE ์ œ์•ฝ ์ตœ์ ํ™”, ์„ ํ˜• ๊ทผ์‚ฌ๋ฅผ ํ†ตํ•œ ์ œ์•ฝ ์ตœ์ ํ™”(๊ทธ๋ผ๋””์–ธํŠธ ๊ณ„์‚ฐ ์—†์Œ). ์œ„ํ‚ค ๊ธฐ์‚ฌ.

์„ ํƒํ•œ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์กฐ๊ฑด๊ณผ ์ œํ•œ ์‚ฌํ•ญ์ด ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ๊ฐœ์ฒด Bounds L-BFGS-B, TNC, SLSQP, trust-constr ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ;
  • ๋ชฉ๋ก (min, max) ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ L-BFGS-B, TNC, SLSQP, trust-constr;
  • ๊ฐ์ฒด ๋˜๋Š” ๊ฐ์ฒด ๋ชฉ๋ก LinearConstraint, NonlinearConstraint COBYLA, SLSQP, trust-constr ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ;
  • ์‚ฌ์ „ ๋˜๋Š” ์‚ฌ์ „ ๋ชฉ๋ก {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} COBYLA, SLSQP ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ.

๊ธฐ์‚ฌ ๊ฐœ์š”:
1) ๊ฐ์ฒด๋กœ ์ง€์ •๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๋ขฐ ์˜์—ญ(method="trust-constr")์—์„œ ์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. Bounds, LinearConstraint, NonlinearConstraint ;
2) ์‚ฌ์ „ ํ˜•์‹์œผ๋กœ ์ง€์ •๋œ ์ œํ•œ ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œ ์ œ๊ณฑ๋ฒ•(๋ฐฉ๋ฒ• = "SLSQP")์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ์ฐจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. {'type', 'fun', 'jac', 'args'};
3) ์›น์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ๋ก€๋กœ ์ œ์ž‘๋œ ์ œํ’ˆ์˜ ์ตœ์ ํ™” ์‚ฌ๋ก€๋ฅผ ๋ถ„์„ํ•œ๋‹ค.

์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•="trust-constr"

๋ฐฉ๋ฒ•์˜ ๊ตฌํ˜„ trust-constr ๊ธฐ๋ฐ˜์œผ๋กœ EQSQP ํ‰๋“ฑ์˜ ํ˜•ํƒœ์— ๋Œ€ํ•œ ์ œ์•ฝ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ TRIP ๋ถˆํ‰๋“ฑ ํ˜•ํƒœ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ. ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์‹ ๋ขฐ ์˜์—ญ์—์„œ ๊ตญ์†Œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ๋Œ€๊ทœ๋ชจ ๋ฌธ์ œ์— ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋กœ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ์˜ ์ˆ˜ํ•™์  ๊ณต์‹ํ™”:

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์—„๊ฒฉํ•œ ๋™๋“ฑ ์ œ์•ฝ ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ ํ•˜ํ•œ์€ ์ƒํ•œ๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”.
๋‹จ๋ฐฉํ–ฅ ์ œ์•ฝ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ ์ƒํ•œ ๋˜๋Š” ํ•˜ํ•œ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. np.inf ํ•ด๋‹น ๊ธฐํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์•Œ๋ ค์ง„ ๋‘ ๋ณ€์ˆ˜์˜ Rosenbrock ํ•จ์ˆ˜์˜ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์ด ๊ฒฝ์šฐ ์ •์˜ ์˜์—ญ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œํ•œ ์‚ฌํ•ญ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์‹œ์ ์— ๋…ํŠนํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”, ์ฒซ ๋ฒˆ์งธ์™€ ๋„ค ๋ฒˆ์งธ ์ œํ•œ์‚ฌํ•ญ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
์ œํ•œ ์‚ฌํ•ญ์„ ์•„๋ž˜์—์„œ ์œ„๋กœ ์‚ดํŽด๋ณด๊ณ  scipy์—์„œ ์ด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ œํ•œ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” ะธ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” Bounds ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

from scipy.optimize import Bounds
bounds = Bounds ([0, -0.5], [1.0, 2.0])

์ œํ•œ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” ะธ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” ์„ ํ˜• ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ LinearConstraint ๊ฐœ์ฒด๋กœ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import numpy as np
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint ([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

๋งˆ์ง€๋ง‰์œผ๋กœ ํ–‰๋ ฌ ํ˜•์‹์˜ ๋น„์„ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์ด ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด ์•ผ์ฝ”๋น„์•ˆ ํ–‰๋ ฌ์„ ์ •์˜ํ•˜๊ณ  ํ—ค์„ธ ํ–‰๋ ฌ๊ณผ ์ž„์˜ ๋ฒกํ„ฐ์˜ ์„ ํ˜• ๊ฒฐํ•ฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”:

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

์ด์ œ ๋น„์„ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ์ฒด๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NonlinearConstraint:

from scipy.optimize import NonlinearConstraint

def cons_f(x):
     return [x[0]**2 + x[1], x[0]**2 - x[1]]

def cons_J(x):
     return [[2*x[0], 1], [2*x[0], -1]]

def cons_H(x, v):
     return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)

ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ ํ–‰๋ ฌ์„ ํฌ์†Œ ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

from scipy.sparse import csc_matrix

def cons_H_sparse(x, v):
     return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
                                            jac=cons_J, hess=cons_H_sparse)

์•„๋‹ˆ๋ฉด ๊ฐ์ฒด๋กœ LinearOperator:

from scipy.sparse.linalg import LinearOperator

def cons_H_linear_operator(x, v):
    def matvec(p):
        return np.array([p[0]*2*(v[0]+v[1]), 0])
    return LinearOperator((2, 2), matvec=matvec)

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
                                jac=cons_J, hess=cons_H_linear_operator)

ํ—ค์„ธ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•  ๋•Œ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ˆ˜์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค HessianUpdateStrategy. ๋‹ค์Œ ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BFGS ะธ SR1.

from scipy.optimize import BFGS

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())

ํ—ค์„ธ ํ–‰๋ ฌ์€ ์œ ํ•œ ์ฐจ๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = cons_J, hess = '2-point')

์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์•ผ์ฝ”๋น„ ํ–‰๋ ฌ์€ ์œ ํ•œ ์ฐจ๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ํ—ค์„ธ ํ–‰๋ ฌ์€ ์œ ํ•œ ์ฐจ๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Hessian์€ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜๊ฑฐ๋‚˜ HessianUpdateStrategy ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

nonlinear_constraint = NonlinearConstraint (cons_f, -np.inf, 1, jac = '2-point', hess = BFGS ())

์ตœ์ ํ™” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

from scipy.optimize import minimize
from scipy.optimize import rosen, rosen_der, rosen_hess, rosen_hess_prod

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 1.11e-16, execution time: 0.033 s.
[0.41494531 0.17010937]

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ—ค์„ธ ํ–‰๋ ฌ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋Š” LinearOperator ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

def rosen_hess_linop(x):
    def matvec(p):
        return rosen_hess_prod(x, p)
    return LinearOperator((2, 2), matvec=matvec)

res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess_linop,
                 constraints=[linear_constraint, nonlinear_constraint],
                 options={'verbose': 1}, bounds=bounds)

print(res.x)

๋˜๋Š” ํ—ค์„ธ ํ–‰๋ ฌ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ ์ž„์˜์˜ ๋ฒกํ„ฐ์˜ ๊ณฑ hessp:

res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hessp=rosen_hess_prod,
                constraints=[linear_constraint, nonlinear_constraint],
                options={'verbose': 1}, bounds=bounds)
print(res.x)

๋Œ€์•ˆ์ ์œผ๋กœ, ์ตœ์ ํ™”๋˜๋Š” ํ•จ์ˆ˜์˜ XNUMX์ฐจ ๋„ํ•จ์ˆ˜์™€ XNUMX์ฐจ ๋„ํ•จ์ˆ˜๋ฅผ ๊ทผ์‚ฌํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ—ค์„ธ ํ–‰๋ ฌ์€ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทผ์‚ฌํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SR1 (์ค€๋‰ดํ„ด ๊ทผ์‚ฌ). ๊ทธ๋ž˜๋””์–ธํŠธ๋Š” ์œ ํ•œ ์ฐจ๋ถ„์œผ๋กœ ๊ทผ์‚ฌํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr',  jac="2-point", hess=SR1(),
               constraints=[linear_constraint, nonlinear_constraint],
               options={'verbose': 1}, bounds=bounds)
print(res.x)

์กฐ๊ฑด๋ถ€ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•="SLSQP"

SLSQP ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

ะ“ะดะต SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” ะธ SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” โ€” ๋™๋“ฑ ๋˜๋Š” ๋ถ€๋“ฑ์˜ ํ˜•ํƒœ๋กœ ์ œํ•œ์„ ์„ค๋ช…ํ•˜๋Š” ํ‘œํ˜„์˜ ์ธ๋ฑ์Šค ์„ธํŠธ. SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™” โ€” ํ•จ์ˆ˜ ์ •์˜ ์˜์—ญ์˜ ํ•˜ํ•œ ๋ฐ ์ƒํ•œ ์„ธํŠธ.

์„ ํ˜• ๋ฐ ๋น„์„ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์€ ํ‚ค๊ฐ€ ์žˆ๋Š” ์‚ฌ์ „ ํ˜•์‹์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. type, fun ะธ jac.

ineq_cons = {'type': 'ineq',
             'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
                                          1 - x [0] ** 2 - x [1],
                                          1 - x [0] ** 2 + x [1]]),
             'jac': lambda x: np.array ([[- 1.0, -2.0],
                                          [-2 * x [0], -1.0],
                                          [-2 * x [0], 1.0]])
            }

eq_cons = {'type': 'eq',
           'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
           'jac': lambda x: np.array ([2.0, 1.0])
          }

์ตœ์†Œ๊ฐ’ ๊ฒ€์ƒ‰์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
               constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
               bounds=bounds)

print(res.x)

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 0.34271757499419825
            Iterations: 4
            Function evaluations: 5
            Gradient evaluations: 4
[0.41494475 0.1701105 ]

์ตœ์ ํ™” ์˜ˆ์‹œ

XNUMX์ฐจ ๊ธฐ์ˆ ๊ตฌ์กฐ๋กœ์˜ ์ „ํ™˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ž‘์ง€๋งŒ ์•ˆ์ •์ ์ธ ์ˆ˜์ž…์„ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ์›น์ŠคํŠœ๋””์˜ค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ์ƒ์‚ฐ ์ตœ์ ํ™”๋ฅผ ์‚ดํŽด๋ณด์ž. ์šฐ๋ฆฌ ์ž์‹ ์ด ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ œํ’ˆ์„ ์ƒ์‚ฐํ•˜๋Š” ์ฃผ๋ฐฉ์˜ ์ฑ…์ž„์ž๋ผ๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค.

  • x0 - ๋žœ๋”ฉ ํŽ˜์ด์ง€ ํŒ๋งค, 10 tr๋ถ€ํ„ฐ.
  • x1 - ๊ธฐ์—… ์›น์‚ฌ์ดํŠธ, 20 tr.
  • x2 - 30 tr๋ถ€ํ„ฐ ์˜จ๋ผ์ธ ์ƒ์ .

์šฐ๋ฆฌ์˜ ์นœ์ ˆํ•œ ์ž‘์—… ํŒ€์—๋Š” ํ›„๋ฐฐ XNUMX๋ช…, ์ค‘๊ฐ„ XNUMX๋ช…, ์„ ๋ฐฐ XNUMX๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›”๊ฐ„ ๊ทผ๋ฌด ์‹œ๊ฐ„ ๊ธฐ๊ธˆ:

  • XNUMX์›”: 4 * 150 = 600 ั‡ะตะป * ั‡ะฐั,
  • ์ค‘๊ฐ„: 2 * 150 = 300 ั‡ะตะป * ั‡ะฐั,
  • ์„ ์ƒ๋‹˜: 150 ั‡ะตะป * ั‡ะฐั.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒซ ๋ฒˆ์งธ ์ฃผ๋‹ˆ์–ด๊ฐ€ (x0, x1, x2), ์ค‘๊ฐ„ - (10, 20, 30), ์‹œ๋‹ˆ์–ด - (7, 15, 20) ์œ ํ˜•์˜ ์‚ฌ์ดํŠธ ํ•˜๋‚˜๋ฅผ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌํ•˜๋Š” ๋ฐ (5, 10, 15) ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ) ์ธ์ƒ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ์‹œ๊ฐ„์˜ ์‹œ๊ฐ„.

์—ฌ๋А ์ด์‚ฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋„ ์›” ์ˆ˜์ต์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋ชฉ์  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. value ํ•œ ๋‹ฌ์— ์ƒ์‚ฐ๋œ ์ œํ’ˆ์˜ ์ˆ˜์ž… ๊ธˆ์•ก:

def value(x):
    return - 10*x[0] - 20*x[1] - 30*x[2]

์ด๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ตœ๋Œ€๊ฐ’์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋ชฉ์  ํ•จ์ˆ˜๋Š” ๋ฐ˜๋Œ€ ๋ถ€ํ˜ธ๋กœ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ง์›์˜ ๊ณผ๋กœ๋ฅผ ๊ธˆ์ง€ํ•˜๊ณ  ๊ทผ๋ฌด ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ œํ•œ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

๋™๋“ฑํ•œ ๊ฒƒ:

SciPy, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ตœ์ ํ™”

ineq_cons = {'type': 'ineq',
             'fun': lambda x: np.array ([600 - 10 * x [0] - 20 * x [1] - 30 * x[2],
                                         300 - 7  * x [0] - 15 * x [1] - 20 * x[2],
                                         150 - 5  * x [0] - 10 * x [1] - 15 * x[2]])
            }

๊ณต์‹์ ์ธ ์ œํ•œ์€ ์ œํ’ˆ ์ถœ๋ ฅ์ด ๊ธ์ •์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

bnds = Bounds ([0, 0, 0], [np.inf, np.inf, np.inf])

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ฐ€์žฅ ์žฅ๋ฐ‹๋น› ๊ฐ€์ •์€ ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ๊ณผ ๋†’์€ ํ’ˆ์งˆ๋กœ ์ธํ•ด ๋งŒ์กฑํ•œ ๊ณ ๊ฐ๋“ค์ด ๋Š์ž„์—†์ด ์šฐ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์›”๊ฐ„ ์ƒ์‚ฐ๋Ÿ‰์„ ์ง์ ‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. scipy.optimize:

x0 = np.array([10, 10, 10])
res = minimize(value, x0, method='SLSQP', constraints=ineq_cons, bounds=bnds)
print(res.x)

[7.85714286 5.71428571 3.57142857]

์ •์ˆ˜๋กœ ๋А์Šจํ•˜๊ฒŒ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ณ  ์ œํ’ˆ์˜ ์ตœ์  ๋ถ„ํฌ๋ฅผ ํ†ตํ•ด ์กฐ์ •์ž์˜ ์›”๊ฐ„ ๋ถ€ํ•˜๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. x = (8, 6, 3) :

  • XNUMX์›”: 8 * 10 + 6 * 20 + 3 * 30 = 290 ั‡ะตะป * ั‡ะฐั;
  • ์ค‘๊ฐ„: 8 * 7 + 6 * 15 + 3 * 20 = 206 ั‡ะตะป * ั‡ะฐั;
  • ์„ ์ƒ๋‹˜: 8 * 5 + 6 * 10 + 3 * 15 = 145 ั‡ะตะป * ั‡ะฐั.

๊ฒฐ๋ก : ์ด์‚ฌ๊ฐ€ ๋งˆ๋•…ํ•œ ์ตœ๋Œ€์น˜๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋งค์›” ๋žœ๋”ฉ ํŽ˜์ด์ง€ 8๊ฐœ, ์ค‘๊ฐ„ ๊ทœ๋ชจ ์‚ฌ์ดํŠธ 6๊ฐœ, ๋งค์žฅ 3๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ตœ์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์„ ๋ฐฐ๋Š” ๊ธฐ๊ณ„์—์„œ ๋ˆˆ์„ ๋–ผ์ง€ ์•Š๊ณ  ์Ÿ๊ธฐ์งˆ์„ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ค‘๊ฐ„์˜ ๋ถ€ํ•˜๋Š” ์•ฝ 2/3, ํ›„๋ฐฐ๋Š” ์ ˆ๋ฐ˜ ๋ฏธ๋งŒ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ํŒจํ‚ค์ง€ ์ž‘์—…์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. scipy.optimize, ์กฐ๊ฑด๋ถ€ ์ตœ์†Œํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์‚ฌ์šฉํ•œ๋‹ค scipy ์ˆœ์ „ํžˆ ํ•™๋ฌธ์  ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋œ ์˜ˆ๊ฐ€ ๊ทธํ† ๋ก ์ฝ”๋ฏนํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, I.L. Akulich์˜ ์ฑ… "์˜ˆ์ œ์™€ ๋ฌธ์ œ์˜ ์ˆ˜ํ•™ ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์—์„œ ๋งŽ์€ ์ด๋ก ๊ณผ ๊ฐ€์ƒ ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ํ•˜๋“œ์ฝ”์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ scipy.optimize ์ด๋ฏธ์ง€ ์„ธํŠธ์—์„œ 3D ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค(ํ•˜๋ธŒ๋ ˆ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ)์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. scipy ์š”๋ฆฌ์ฑ….

์ฃผ์š” ์ •๋ณด ์ถœ์ฒ˜๋Š” docs.scipy.org์ด ์„น์…˜๊ณผ ๋‹ค๋ฅธ ์„น์…˜์˜ ๋ฒˆ์—ญ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค scipy ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค GitHub์˜.

๊ฐ์‚ฌ ๋ฉ”ํ”ผ์Šคํ† ํ”ผ ์ถœํŒ๋ฌผ ์ค€๋น„์— ์ฐธ์—ฌํ•˜๊ธฐ ์œ„ํ•ด.

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster