Nelder-Mead 알고리즘이란?
SciPy 라이브러리는 복잡한 과학적 계산을 빠른 속도와 높은 효율로 수행할 수 있도록 지원하는 강력한 도구입니다. 그중에서 Nelder-Mead 알고리즘은 '단순 탐색(simplex search) 알고리즘'이라고도 불립니다.
Nelder-Mead 알고리즘은 매개변수 추정 문제와 통계 문제를 해결하는 데 가장 효과적인 알고리즘 중 하나로 평가받습니다. 특히 함수 값이 불확실하거나 많은 노이즈(noise)가 섞여 있는 상황에서 이 알고리즘을 활용하는 것이 적합합니다.
또한 이 알고리즘은 통계 분야에서 자주 등장하는 불연속 함수(discontinuous functions)에도 적용할 수 있습니다. 구조가 단순하고 이해하기 쉬우며, 다차원 비제약 최적화(multidimensional unconstrained optimization) 상황에서 비선형 함수의 매개변수를 최소화하는 데 사용됩니다.
다만, 최적의 기울기(gradient) 값을 찾는 용도로는 권장되지 않습니다. 연산에 오랜 시간이 소요될 수 있기 때문입니다.
그럼 실제 예시를 통해 살펴보겠습니다.
예시 코드
import numpy as np
from scipy.optimize import minimize
def f(x):
return .6*(1 - x[0])**2
scipy.optimize.minimize(f, [2, -1], method="Nelder-Mead")출력 결과
final_simplex: (array([[ 1. , -1.27109375],
[ 1. , -1.27118835],
[ 1. , -1.27113762]]), array([0., 0., 0.]))
fun: 0.0
message: 'Optimization terminated successfully.'
nfev: 147
nit: 69
status: 0
success: True
x: array([ 1. , -1.27109375])코드 설명
필요한 라이브러리인 numpy와 scipy.optimize를 임포트합니다.
값을 인자로 받아 수학적 연산을 수행하는 함수 'f'를 정의합니다.
scipy 라이브러리의 optimize 모듈에 포함된 'minimize' 함수에 목적 함수 'f', 초기 추정값 [2, -1], 그리고 최적화 방법으로 "Nelder-Mead"를 지정하여 호출합니다.
'minimize' 함수는 전달받은 함수의 값을 최소화하는 방향으로 심플렉스(simplex)를 반복적으로 조정하며 최적해를 탐색합니다.
최종 최적화 결과가 콘솔에 출력됩니다.
결과 해석
출력 결과에서 success: True와 message: 'Optimization terminated successfully.'를 통해 최적화가 성공적으로 종료되었음을 확인할 수 있습니다. 함수의 최솟값(fun)은 0.0이며, 해당 지점의 x 값은 약 [1.0, -1.27]입니다. 총 147번의 함수 호출(nfev)과 69번의 반복(nit)을 거쳐 최적해에 도달했음을 알 수 있습니다.