결국엔 이렇게 봐도 저렇게 봐도 말하고자 하는 바는 같다. 두 포인트가 같아지면 수평이 된다는 이야기다.
사실 먼저 그레디언트값을 구해두고 헤시안행렬을 구할 수 밖에 없다. 아래의 얘기를 해두고 싶어서 그랬다.
아래는 경사하강법을 사용하여 R 코딩을 이용했습니다.
> f <- function(x1,x2){
+ 3*x1^2 + 5*x2^2 +2*x1 -5*x1*x2
+ }
> f
function(x1,x2){
3*x1^2 + 5*x2^2 +2*x1 -5*x1*x2
}
#그림으로 임계점이 있는지 보자.
#library(mosaic)
#추가적으로 'manipulate'라는 패키지가 필요 할 수 있습니다. 필요하다면 받아주시고 라이브러리로 읽어주세요.
plotFun(3*x1^2 + x2^2 -2*x1 +5*x1*x2 ~ x1&x2,
x1.lim = range(-50,50),
x2.lim = range(-50,50),
surface = T,
alpha = 1,
xlab = expression(x[1]),
ylab = expression(x[2]),
zlab = expression(f(x[1],x[2]))
)
library('magrittr')
library('Deriv')
> partial_x1 <- Deriv(f,'x1')
> partial_x1
function (x1, x2)
2 + 6 * x1 - 5 * x2
> partial_x2 <- Deriv(f,'x2')
> partial_x2
function (x1, x2)
10 * x2 - 5 * x1
#초기값,alhpa 지정.
x<-c(-5,-5)
alhpa<-0.05
> #1번 새로운 x값으로 갱신. x=(-4.85,-3.75)
> x-alhpa*c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))
[1] -4.85 -3.75
> #위 과정을 계속 반복하자.
> for(i in 1:200){
+ x<-x-alhpa*c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))
+ }
> x
[1] -0.5714286 -0.2857143
> f(x[1],x[2])
[1] -0.5714286
#아래는 위에서 설명한 코드에 사용이 부적합한 이유이다.
#?는 갱신한 x값이라고 하자.
c(partial_x1(x[1],x[2]),partial_x2(x[1],x[2]))=x-?/-alpha
#?를 알아내려면 "? = 식" 형태로 나타내야하기 때문에 적합하지 않다.
'최적화 및 기계학습 > 기계학습(ML)' 카테고리의 다른 글
적대적 생성 신경망(GAN) 이론 및 과정 (0) | 2024.06.11 |
---|---|
벡터미분(공식,미분으로 증명) (0) | 2024.04.16 |
선형회귀(LR)-3 :결정계수와 회귀분석결과 해석. (0) | 2024.04.03 |
선형회귀(LR)-2 : 유도과정,다중선형회귀 (0) | 2024.04.02 |
선형회귀(Linear Regression)-1 (0) | 2024.04.02 |