R - 경사하강법.

🛟 Dive.·2024년 2월 24일

경사하강법

회귀분석을 통한 예측.

회귀분석은 변수 간 관계를 모형화하는 통계적 방법.

하나의 독립변수와 하나의 종속변수 간 회귀분석은 단순 회귀분석이라함. 이에 비해 독립변수가 여러 개인 경우를 다중 회귀분석 이라함.

회귀분석 개요.

회귀분석은 변수 간의 관계를 추정하는 통게적인 방법. 선형회귀분석은 독립변수에 대한 종속변수의 값들을 이용해 두 변수 간의 선형 관계를 설명하는 회귀선인 직선의 방정식을 만듦.

R을 이용한 문제 해결.

사용 패키지 회귀선의 기울기와 y절편을 구해봄. 기울기와 Y절편의 변화에 따라 비용함수 값의 크기 변화를 3차원으로 보기 위해 scatterplot3d 패키지를 사용하도록 함.

학습 데이터 작성.

**x = c(10, 22, 35, 40, 52, 64, 71, 83, 92, 100)
y = c(41, 45, 62, 75, 85, 90, 110, 115, 125, 140)**

선형관계 확인.

plot(x, y, xlim = c(0, max(x)), ylim = c(0, max(y)))

초기치 설정.

a = 25.5
b = 0.8
db = 0.1
da = 0.1
f.min = 100000

a , b 수정.

plot(x, y, xlim = c(0, max(x)), ylim = c(0, max(y)))

a = 25.5
b = 0.8
db = 0.1
da = 0.1
f.min = 100000

A = NULL
b = NULL
c = NULLi = 0
while(TRUE) {
  i = i + 1
  
  # 비용함수 f(a, b)
  err.sum = 0
  for (k in 1:length(x)) {
    y_hat = b * x[k]^2
    err = (y_hat - y[k]) ^ 2
    err.sum = err.sum + err
  }
  f = round(err.sum/2,1)
  print(paste("a = ",a, "b = ", b,sep = ""))
  print(paste(i, "단계", sep = ""))
  print(paste("Cf.min = ", round(Cf.min,1), ",Cf = ",round(Cf,1),sep = ""))
  
  # 종료여부 결정.
  if (f >= f.min)
    break
  else {
    f.min = f
    a.min = a
    b.min = b
  }
  A = c(A, a)
  B = c(B, b)
  C = c(F, f)
  
  # a의 변화와 비용함수 값.
  err.sum <- 0
  for (k in 1 : length(x)) {
    y_hat = b*x[k] + (a + da)
    err = (y_hat - y[k]^ 2)
    err.sum = err.sum + err
  }
  f.da = round(err.sum / 2, 1)
  
  slope.da = (f.da - f) /da
  
  print(paste("f.da = ", round(f.da, 1), " , slope.da = ", round(slope.da , 1), "da = ",
              da, "a = ", a, sep = ""))
  
  da <-- sign(slope.da) * abd(da)
  
  # b의 변화와 비용함수 값.
  err.sum <- 0
  for (k in 1: length(x)) {
    y_hat = (b + db) * x[k] + a
    err = (y_hat - y[k]^2)
    err.sum = err.sum + err
  }
  f.db = round(err.sum/2, 1)
               
  print(paste("f.db = ", round(f.db, 1),", slope.db = ", round(slope.db,1), "db = ",
              ,db,", b = ",b, sep = ""))
  
  db <-- sign(slope.db) * abd(db)
  
  a = round(a + da, 2)
  b = round(b + db, 2)
  
  print(paste("da = ", da, "db = ", db, "a = ",a, "b = ", b, sep = ""))
}
}

회귀선 그리기.

plot(x, y, xlim = c(0, max(x)), ylim = c(0, max(y)))
abline(b = b.min, a = a.min, col = "red", lty = 2)

수리적 모형으로 해 구하기.

lm(y ~ x)

비용함수 값의 변화.

# 비용함수 값의 변화.
par(mfrow = c(1, 3))
plot(1:length(A), A, 
     xlab = "반복 수", ylab = "Y절편",
     main = "y절편의 변화",
     type = "o")
plot(1:length(B), B, 
     xlab = "반복 수", ylab = "기울기",
     main = "기울기의 변화",
     type = "o")
plot(1:length(F), F, 
     xlab = "반복 수", ylab = "비용함수 값",
     main = "비용함수값의 변화",
     type = "o")

비용함수 값의 변화(3차원비교.

# 비용함수 값의 변화(3차원 비교)
install.packages("scatterplot3d")
lbrary(scatterplot3d)
s3d = scatterplot3d(x = A, y = B, z = F/1000,
                    pch = 19,
                    cex.symbols = 1.5,
                    color = "steelbule",
                    type = "h",
                    main = "비용함수의 변화",
                    xlab = "y절편",
                    ylab = "기울기",
                    zlab = "비용함수(X1000)")
text(s3d$xyz.convert(A,B,F/1000 + 0.3),
     labels = 1:length(A),
     cex = 0.8, col = "red")

profile
Data Science. DevOps.

0개의 댓글