SciPy-최적화

그만큼 scipy.optimize package일반적으로 사용되는 몇 가지 최적화 알고리즘을 제공합니다. 이 모듈에는 다음과 같은 측면이 포함됩니다.

  • 다양한 알고리즘 (예 : BFGS, Nelder-Mead Simplex, Newton Conjugate Gradient, COBYLA 또는 SLSQP)을 사용하여 다변량 스칼라 함수 (minimize ())의 제한 및 제한 최소화

  • 글로벌 (brute-force) 최적화 루틴 (예 : anneal (), basinhopping ())

  • 최소 제곱 최소화 (leastsq ()) 및 곡선 피팅 (curve_fit ()) 알고리즘

  • 스칼라 일 변량 함수 최소화 기 (minimize_scalar ()) 및 루트 파인더 (newton ())

  • 다양한 알고리즘 (예 : 하이브리드 Powell, Levenberg-Marquardt 또는 Newton-Krylov와 같은 대규모 방법)을 사용하는 다변량 방정식 시스템 솔버 (root ())

다변량 스칼라 함수의 제한 및 제한 최소화

그만큼 minimize() function 다변량 스칼라 함수에 대한 제약없는 최소화 및 제약 된 최소화 알고리즘에 대한 공통 인터페이스를 제공합니다. scipy.optimize. 최소화 함수를 설명하기 위해 NN 변수의 Rosenbrock 함수를 최소화하는 문제를 고려하십시오.

$$ f (x) = \ sum_ {i = 1} ^ {N-1} \ : 100 (x_i-x_ {i-1} ^ {2}) $$

이 함수의 최소값은 0이며 xi = 1 일 때 달성됩니다.

Nelder–Mead Simplex 알고리즘

다음 예에서, minimal () 루틴은 Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(method 매개 변수를 통해 선택됨). 다음 예를 살펴 보겠습니다.

import numpy as np
from scipy.optimize import minimize

def rosen(x):

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')

print(res.x)

위의 프로그램은 다음과 같은 출력을 생성합니다.

[7.93700741e+54  -5.41692163e+53  6.28769150e+53  1.38050484e+55  -4.14751333e+54]

심플 렉스 알고리즘은 아마도 상당히 잘 작동하는 함수를 최소화하는 가장 간단한 방법 일 것입니다. 기능 평가 만 필요하며 간단한 최소화 문제에 적합한 선택입니다. 그러나 그래디언트 평가를 사용하지 않기 때문에 최소값을 찾는 데 더 오래 걸릴 수 있습니다.

최소값을 찾기 위해 함수 호출 만 필요한 또 다른 최적화 알고리즘은 Powell‘s method이는 minimal () 함수에서 method = 'powell'을 설정하여 사용할 수 있습니다.

최소 제곱

변수에 경계가있는 비선형 최소 제곱 문제를 풉니 다. 잔차 f (x) (n 개의 실수 변수의 m 차원 실수 함수)와 손실 함수 rho (s) (스칼라 함수)가 주어지면 least_squares는 비용 함수 F (x)의 국소 최솟값을 찾습니다. 다음 예를 살펴 보겠습니다.

이 예에서는 독립 변수에 대한 경계가없는 Rosenbrock 함수의 최소값을 찾습니다.

#Rosenbrock Function
def fun_rosenbrock(x):
   return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
   
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)

print res

잔차의 벡터 만 제공합니다. 이 알고리즘은 비용 함수를 잔차 제곱합으로 구성하여 Rosenbrock 함수를 제공합니다. 정확한 최소값은 x = [1.0,1.0]입니다.

위의 프로그램은 다음과 같은 출력을 생성합니다.

active_mask: array([ 0., 0.])
      cost: 9.8669242910846867e-30
      fun: array([ 4.44089210e-15, 1.11022302e-16])
      grad: array([ -8.89288649e-14, 4.44089210e-14])
      jac: array([[-20.00000015,10.],[ -1.,0.]])
   message: '`gtol` termination condition is satisfied.'
      nfev: 3
      njev: 3
   optimality: 8.8928864934219529e-14
      status: 1
      success: True
         x: array([ 1., 1.])

뿌리 찾기

SciPy에서 루트 찾기가 어떻게 도움이되는지 이해하겠습니다.

스칼라 함수

단일 변수 방정식이있는 경우 시도 할 수있는 네 가지 다른 근 찾기 알고리즘이 있습니다. 이러한 각 알고리즘에는 근이 예상되는 구간의 끝 점이 필요합니다 (함수가 부호를 변경하기 때문에). 일반적으로brentq 최선의 선택이지만 다른 방법은 특정 상황이나 학업 목적에 유용 할 수 있습니다.

고정 소수점 해결

함수의 0을 찾는 것과 밀접하게 관련된 문제는 함수의 고정 된 점을 찾는 문제입니다. 함수의 고정 소수점은 함수의 평가가 g (x) = x라는 점을 반환하는 지점입니다. 분명히 고정 된 지점ggf (x) = g (x) −x의 근입니다. 동등하게, 루트ffg (x) = f (x) + x의 fixed_point입니다. fixed_point 루틴은 다음을 사용하는 간단한 반복 방법을 제공합니다.Aitkens sequence acceleration 고정 소수점을 추정하기 위해 gg, 시작점이 주어진 경우.

방정식 세트

비선형 방정식 세트의 근을 찾는 방법은 다음과 같습니다. root() function. 여러 가지 방법을 사용할 수 있습니다.hybr (기본값) 및 lm은 각각 hybrid method of Powell 그리고 Levenberg-Marquardt method MINPACK에서.

다음 예에서는 단일 변수 초월 방정식을 고려합니다.

x2 + 2cos(x) = 0

그 루트는 다음과 같이 찾을 수 있습니다-

import numpy as np
from scipy.optimize import root
def func(x):
   return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol

위의 프로그램은 다음과 같은 출력을 생성합니다.

fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
   nfev: 10
   qtf: array([ -2.77644574e-12])
      r: array([-3.34722409])
   status: 1
   success: True
      x: array([-0.73908513])