book title : 머신러닝, 딥러닝에 필요한 기초 수학 with 파이썬
pages : 227 ~ 241
key concepts :
행렬의 형식(form of a matrix)
최적성 조건
최적해 산출 예시
0) 어떤 다변수 함수가 있으면,
1) 그 함수의 경사도벡터(c)를 편미분해서 구한다.
2) 그 경사도벡터를 또 편미분해서 헤시안행렬(Hf)을 구한다.
3) 이때 지역최소가 되려면 경사도벡터(c)는 0이 되어야 한다.(1계 필요조건)
4) 그리고 c=0 방정식의 해가 되는 다변수(x, y)를 헤시안행렬(Hf)에 넣어서 그곳에서의 행렬의 실제값을 확인한다.
5) 양정행렬이면 최적성 조건이 성립되어서 그 지역에서의 최소가 된다.(2계 충분조건)
6) 이때 양정행렬임을 판단하는 방법은 행렬의 고윳값(eigen value)가 모두 양수인지 검사하는 것
7) 찾아봐서 맞으면 이렇게 나온 (x, y)의 값은 최적해이다.
import sympy as sp
x = sp.Symbol('x')
y = sp.Symbol('y')
f = 50*(y-x**2)**2 + (2-x)**2 # 다변수 함수
c = sp.derive_by_array(f, (x, y)) # 경사도벡터를 구하는 식
Hf = sp.derive_by_array(c, (x, y)) # 경사도벡터를 또 편미분해서 헤시안 행렬을 구하는 식
first_ncs_sol = sp.solve(c) # 경사도벡터의 해 확인(x:2, y:4 나옴)
first_ncs_sol >>> 반환 값 [{x: 2, y: 4}]
H = Hf.subs({x:first_ncs_sol[0][x], y:first_ncs_sol[0][y]}) # 편미분계수로 이루어진 헤시안행렬에 x, y값 넣기
import numpy as np # 고윳값 찾기 위해 Numpy 사용
H = np.array(H).astype(np.float64).reshape(2,2) # H를 넘파이 행렬로 변환
lamda, _ = np.linalg.eig(H) # 고윳값 산출, _는 고윳값 벡터
lamda
>>> array([1.70188248e+03, 1.17516927e-01])
# 둘 다 양수이므로 (2, 4)는 최적해임이 확정됨