estimated_standard_deviation
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| estimated_standard_deviation [2026/03/10 05:13] – [R에서 msr이 최소값이 되는 v값 효율적으로 찾기] hkimscil | estimated_standard_deviation [2026/03/11 01:56] (current) – [실험적, R에서 시뮬레이션으로 이해] hkimscil | ||
|---|---|---|---|
| Line 57: | Line 57: | ||
| ====== 실험적, R에서 시뮬레이션으로 이해 ====== | ====== 실험적, R에서 시뮬레이션으로 이해 ====== | ||
| 아래 output의 코멘트를 읽을 것 | 아래 output의 코멘트를 읽을 것 | ||
| + | <tabbox rs01> | ||
| < | < | ||
| rm(list=ls()) | rm(list=ls()) | ||
| Line 136: | Line 137: | ||
| vs[min.pos.msrs] | vs[min.pos.msrs] | ||
| </ | </ | ||
| - | ===== output ===== | + | <tabbox ro01> |
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > rm(list=ls()) | > rm(list=ls()) | ||
| Line 165: | Line 166: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | <WRAP column |
| SS = sum(x-mean(x))^2 인데, mean(x)을 즉, x집합의 평균을, x 원소값을 예측하는데 (빼는데) 사용하면 SS값이 최소값이 된다고 하였다. 이것을 R에서 simulation으로 알아보기 위해서 mean(x) 대신에 다른 숫자들을 넣어보려고 한다. 이를 v라고 하면 sum(x-v)^2이라는 SS값들을 구해서 비교하려는 것이다. 대입할 숫자들은 (v) mean(x) +- 3 sd(x) 를 범위로 하고, 그 범위의 시작 숫자에서 (시작은 mean(x)-3sd(x)가 된다) 0.1씩 증가시키면서 대입하고, | SS = sum(x-mean(x))^2 인데, mean(x)을 즉, x집합의 평균을, x 원소값을 예측하는데 (빼는데) 사용하면 SS값이 최소값이 된다고 하였다. 이것을 R에서 simulation으로 알아보기 위해서 mean(x) 대신에 다른 숫자들을 넣어보려고 한다. 이를 v라고 하면 sum(x-v)^2이라는 SS값들을 구해서 비교하려는 것이다. 대입할 숫자들은 (v) mean(x) +- 3 sd(x) 를 범위로 하고, 그 범위의 시작 숫자에서 (시작은 mean(x)-3sd(x)가 된다) 0.1씩 증가시키면서 대입하고, | ||
| Line 174: | Line 175: | ||
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > x.span <- seq(from = mean(x)-3*sd(x), | > x.span <- seq(from = mean(x)-3*sd(x), | ||
| Line 216: | Line 217: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | <WRAP column |
| x-mean(x) = residual = error | x-mean(x) = residual = error | ||
| sum(residual^2) = SS (sum of square) | sum(residual^2) = SS (sum of square) | ||
| Line 228: | Line 229: | ||
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > | > | ||
| Line 252: | Line 253: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | <WRAP column |
| * 이 후 쓸 function들. (x-v) = residual이라고 부르니까 이 residual을 모으는 function | * 이 후 쓸 function들. (x-v) = residual이라고 부르니까 이 residual을 모으는 function | ||
| * function ssr = x 집합과 v값 (x.span의 한 숫자)를 인수를 주었을 때 구할 수 있는 Sum of Square값들 (실제로는 사용하지 않는다. 대신 msr 펑션으로 MS값을 구한다). | * function ssr = x 집합과 v값 (x.span의 한 숫자)를 인수를 주었을 때 구할 수 있는 Sum of Square값들 (실제로는 사용하지 않는다. 대신 msr 펑션으로 MS값을 구한다). | ||
| Line 260: | Line 261: | ||
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > ssrs <- c() # sum of square residuals | > ssrs <- c() # sum of square residuals | ||
| Line 285: | Line 286: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | |
| + | <WRAP column | ||
| comment | comment | ||
| * x.span의 처음값인 35.1을 넣어서 (x-v)를 구한 후 | * x.span의 처음값인 35.1을 넣어서 (x-v)를 구한 후 | ||
| Line 302: | Line 304: | ||
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > # v값이 x.span에 따라서 변화하여 대입되었을 때의 | > # v값이 x.span에 따라서 변화하여 대입되었을 때의 | ||
| Line 372: | Line 374: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | <WRAP column |
| comment | comment | ||
| * msrs값에 저장된 msr값들 (mean square residual값들) 중에서 | * msrs값에 저장된 msr값들 (mean square residual값들) 중에서 | ||
| Line 382: | Line 384: | ||
| <WRAP group> | <WRAP group> | ||
| - | < | + | <WRAP column |
| < | < | ||
| > # 아래는 위에서 계산한 msr 값들을 저장한 msrs값들 중에서 최소값이 되는 것을 찾은 | > # 아래는 위에서 계산한 msr 값들을 저장한 msrs값들 중에서 최소값이 되는 것을 찾은 | ||
| Line 408: | Line 410: | ||
| </ | </ | ||
| </ | </ | ||
| - | < | + | <WRAP column |
| comment | comment | ||
| * msrs 의 min(msrs)값을 찾는다 24.975 | * msrs 의 min(msrs)값을 찾는다 24.975 | ||
| Line 420: | Line 422: | ||
| </ | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== 미분으로 기울기가 최소값이 될 때를 찾는 법 ===== | ||
| 다음으로 MS값을 구하는 식인 | 다음으로 MS값을 구하는 식인 | ||
| Line 451: | Line 458: | ||
| < | < | ||
| </ | </ | ||
| - | <code> | + | <tabbed> |
| - | # the above no gradient | + | * *estimated_standard_deviation/ |
| - | + | * estimated_standard_deviation/rout02 | |
| - | gradient <- function(x, v){ | + | </tabbed> |
| - | residuals = x - v | + | |
| - | # y = (sum(x-v)^2)/ | + | |
| - | # 의 식이 ms값을 구하는 식인데 | + | |
| - | # 이를 v에 대해서 미분하면 chain rule을 써야 한다 | + | |
| - | # 자세한 것은 http:// | + | |
| - | # 문서 중에 미분 부분 참조 | + | |
| - | # dy/dv = ( 2(x-v)*-1 ) / n chain rule | + | |
| - | # dy/dv = -2 (x-v) / n = -2 (mean(residual)) | + | |
| - | dx = -2 * mean(residuals) | + | |
| - | # return(list(" | + | |
| - | return(dx) | + | |
| - | } # function returns ds value | + | |
| - | + | ||
| - | zx <- (x-mean(x))/ | + | |
| - | # pick one random v in (x-v) | + | |
| - | v <- rnorm(1) | + | |
| - | + | ||
| - | # Train the model with scaled features | + | |
| - | learning.rate = 1e-1 | + | |
| - | + | ||
| - | msrs <- c() | + | |
| - | vs <- c() | + | |
| - | + | ||
| - | msr <- function(x, v) { | + | |
| - | residuals <- (x - v) | + | |
| - | return((mean(residuals^2))) | + | |
| - | } | + | |
| - | + | ||
| - | nlen <- 75 | + | |
| - | for (epoch in 1:nlen) { | + | |
| - | residual <- residuals(zx, | + | |
| - | msr.x <- msr(zx, v) | + | |
| - | msrs <- append(msrs, | + | |
| - | + | ||
| - | grad <- gradient(zx, | + | |
| - | step.v <- grad * learning.rate # | + | |
| - | v <- v - step.v # 그 다음 v값 | + | |
| - | vs <- append(vs, v) # v값 저장 | + | |
| - | } | + | |
| - | + | ||
| - | tail(msrs) | + | |
| - | tail(vs) | + | |
| - | + | ||
| - | plot(vs, msrs, type=' | + | |
| - | + | ||
| - | # scaled | + | |
| - | vs # 변화하는 v 값들의 집합 | + | |
| - | vs.orig <- (vs*sd(x))+mean(x) | + | |
| - | vs.orig | + | |
| - | + | ||
| - | # 마지막 v값이 최소값에 근접한 값 | + | |
| - | v | + | |
| - | v.orig <- (v*sd(x))+mean(x) | + | |
| - | v.orig | + | |
| - | + | ||
| - | plot(vs.orig, | + | |
| - | + | ||
| - | </ | + | |
| - | ===== output ===== | + | |
| - | <WRAP group> | + | |
| - | <WRAP half column> | + | |
| - | < | + | |
| - | > # the above no gradient | + | |
| - | > | + | |
| - | > gradient <- function(x, v){ | + | |
| - | + | + | |
| - | + # y = (sum(x-v)^2)/ | + | |
| - | + # 의 식이 ms값을 구하는 식인데 | + | |
| - | + # 이를 v에 대해서 미분하면 chain rule을 써야 한다 | + | |
| - | + # 자세한 것은 http:// | + | |
| - | + # 문서 중에 미분 부분 참조 | + | |
| - | + # dy/dv = ( 2(x-v)*-1 ) / n chain rule | + | |
| - | + # dy/dv = -2 (x-v) / n = -2 (mean(residual)) | + | |
| - | + dx = -2 * mean(residuals) | + | |
| - | + # return(list(" | + | |
| - | + | + | |
| - | + } # function returns ds value | + | |
| - | > | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | > | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | <WRAP half column> | + | |
| - | comment | + | |
| - | 이 R script의 목적은 v값이 최소값이 되는 지점을 자동적으로 찾아보려는 것이다. 이것을 위해서 우선 v값으로 사용할 첫 점수를 랜덤하게 구한 후 (아래 그래프에서 빨간색 지점), 자동적으로 그 다음 v 점수를 찾고 (녹색지점), | + | |
| - | * gradient function과 | + | |
| - | * learning_rate 값이다. | + | |
| - | gradient 펑션은 dy/dv 의 연쇄 미분식인 ([[:chain rules]]) -2(x-v) / n = -2 mean(res) 값을 구하는 것이다. 이렇게 구한 값에 learning_rate값을 곱한후, 이것을 먼저 사용한 v값에서 (빨간색 지점) 빼 주어 다음 v값으로 (녹색지점) 사용하려고 한다. 이 녹색지점에서의 v값을 사용했을 때의 gradient값을 구한 후 다시 이값에 learning_rate인 0.1을 곱하여 그다음 스텝의 값을 얻고, 이 값을 바로 전의 v값에서 빼 준 값을 그 다음 v값으로 사용한다. 이렇게 구하는 v값들은 0.1씩 곱해주는 효과때문에 오른 쪽으로 옮겨가는 지점이 "< | + | |
| - | + | ||
| - | {{: | + | |
| - | 클릭하면 큰 이미지로 볼 수 있음 | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | <WRAP group> | + | |
| - | <WRAP half column> | + | |
| - | < | + | |
| - | > zx <- (x-mean(x))/ | + | |
| - | > # pick one random v in (x-v) | + | |
| - | > v <- rnorm(1) | + | |
| - | > | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | > | + | |
| - | </ | + | |
| - | </ | + | |
| - | <WRAP half column> | + | |
| - | comment | + | |
| - | * 랜덤하게 v값을 찾음 '' | + | |
| - | * 원래는 mean(x)값 근처의 값을 랜덤하게 골라야 하므로 | + | |
| - | * '' | + | |
| - | * 그렇게 하질 않고 x 집합의 원소들을 표준점수화 한 후 '' | + | |
| - | * '' | + | |
| - | * 이렇게 하는 이유는 혹시 나중에 다른 x집합에 똑같은 작업을 하더라도 그 집합의 평균과 표준편차를 사용하지 않고 | + | |
| - | * 단순히 '' | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | <WRAP group> | + | |
| - | <WRAP half column> | + | |
| - | < | + | |
| - | > # Train the model with scaled features | + | |
| - | > learning.rate = 1e-1 | + | |
| - | > | + | |
| - | </ | + | |
| - | </ | + | |
| - | <WRAP half column> | + | |
| - | comment | + | |
| - | * 이 0.1은 gradient function으로 구한 해당 v값에 대한 y 미분값을 (기울기 값을) 구한 후, 여기에 곱하기 위해서 지정한다. | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | <WRAP group> | + | |
| - | <WRAP half column> | + | |
| - | < | + | |
| - | > msrs <- c() | + | |
| - | > vs <- c() | + | |
| - | > | + | |
| - | > nlen <- 75 | + | |
| - | > for (epoch in 1:nlen) { | + | |
| - | + | + | |
| - | + msr.x <- msr(zx, v) | + | |
| - | + msrs <- append(msrs, | + | |
| - | + | + | |
| - | + grad <- gradient(zx, | + | |
| - | + | + | |
| - | + v <- v - step.v # 그 다음 v값 | + | |
| - | + vs <- append(vs, v) # v값 저장 | + | |
| - | + } | + | |
| - | > | + | |
| - | > tail(msrs) | + | |
| - | [1] 0.999 0.999 0.999 0.999 0.999 0.999 | + | |
| - | > tail(vs) | + | |
| - | [1] 6.415945e-08 5.132756e-08 4.106205e-08 3.284964e-08 2.627971e-08 2.102377e-08 | + | |
| - | > | + | |
| - | > plot(vs, msrs) | + | |
| - | > | + | |
| - | > | + | |
| - | </ | + | |
| - | </ | + | |
| - | <WRAP half column> | + | |
| - | comment | + | |
| - | * nlen는 그냥 자의적으로 지정한다. 여기서는 75로 했다. | + | |
| - | * for 문에서 처음 v값은 위에서 랜덤으로 구한 값이다 (v). | + | |
| - | * 이 v값으로 gradient 펑션의 아웃풋 값을 구하고 (-2(residual)) = '' | + | |
| - | * 이 값에 learning_rate값을 곱한 값을 구하여 '' | + | |
| - | * 이 값을 원래 v값에서 빼준 후에 | + | |
| - | * 다시 (for 문에서 반복하는 동안) v값으로 바꾼 후 '' | + | |
| - | * for문을 nlen번 만큼 반복한다. | + | |
| - | * 이 과정에서 저장한 | + | |
| - | * msr값들과 | + | |
| - | * vs값들의 마지막 6개를 살펴본다. | + | |
| - | * v 값으로 x집합의 평균값을 사용하는 것이 최소 msr값이 된다는 것이 맞다면 | + | |
| - | * v 값은 0이 될것이다 (왜냐하면 x집합을 zx로 바꿨기 때문에, 즉 평균이 0이고 sd값이 1일 집합으로 바꿨기 때문에) | + | |
| - | * 아래 그래프의 각 포인트는 v값의 이동을 나타내는데 grad*learning_rate의 영향으로 점진적으로 하가하여 최소값으로 도달한다. | + | |
| - | + | ||
| - | {{: | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | <WRAP group> | + | |
| - | <WRAP half column> | + | |
| - | < | + | |
| - | > # scaled | + | |
| - | > vs # 변화하는 v 값들의 집합 | + | |
| - | [1] 3.119260e-01 2.495408e-01 1.996326e-01 1.597061e-01 1.277649e-01 1.022119e-01 8.176952e-02 | + | |
| - | [8] 6.541561e-02 5.233249e-02 4.186599e-02 3.349279e-02 2.679424e-02 2.143539e-02 1.714831e-02 | + | |
| - | [15] 1.371865e-02 1.097492e-02 8.779935e-03 7.023948e-03 5.619158e-03 4.495327e-03 3.596261e-03 | + | |
| - | [22] 2.877009e-03 2.301607e-03 1.841286e-03 1.473029e-03 1.178423e-03 9.427383e-04 7.541907e-04 | + | |
| - | [29] 6.033525e-04 4.826820e-04 3.861456e-04 3.089165e-04 2.471332e-04 1.977066e-04 1.581652e-04 | + | |
| - | [36] 1.265322e-04 1.012258e-04 8.098061e-05 6.478449e-05 5.182759e-05 4.146207e-05 3.316966e-05 | + | |
| - | [43] 2.653573e-05 2.122858e-05 1.698286e-05 1.358629e-05 1.086903e-05 8.695226e-06 6.956181e-06 | + | |
| - | [50] 5.564945e-06 4.451956e-06 3.561565e-06 2.849252e-06 2.279401e-06 1.823521e-06 1.458817e-06 | + | |
| - | [57] 1.167054e-06 9.336428e-07 7.469143e-07 5.975314e-07 4.780251e-07 3.824201e-07 3.059361e-07 | + | |
| - | [64] 2.447489e-07 1.957991e-07 1.566393e-07 1.253114e-07 1.002491e-07 8.019931e-08 6.415945e-08 | + | |
| - | [71] 5.132756e-08 4.106205e-08 3.284964e-08 2.627971e-08 2.102377e-08 | + | |
| - | > vs.orig <- (vs*sd(x))+mean(x) | + | |
| - | > vs.orig | + | |
| - | [1] 51.55963 51.24770 50.99816 50.79853 50.63882 50.51106 50.40885 50.32708 50.26166 50.20933 | + | |
| - | [11] 50.16746 50.13397 50.10718 50.08574 50.06859 50.05487 50.04390 50.03512 50.02810 50.02248 | + | |
| - | [21] 50.01798 50.01439 50.01151 50.00921 50.00737 50.00589 50.00471 50.00377 50.00302 50.00241 | + | |
| - | [31] 50.00193 50.00154 50.00124 50.00099 50.00079 50.00063 50.00051 50.00040 50.00032 50.00026 | + | |
| - | [41] 50.00021 50.00017 50.00013 50.00011 50.00008 50.00007 50.00005 50.00004 50.00003 50.00003 | + | |
| - | [51] 50.00002 50.00002 50.00001 50.00001 50.00001 50.00001 50.00001 50.00000 50.00000 50.00000 | + | |
| - | [61] 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 | + | |
| - | [71] 50.00000 50.00000 50.00000 50.00000 50.00000 | + | |
| - | > | + | |
| - | > # 마지막 v값이 최소값에 근접한 값 | + | |
| - | > v | + | |
| - | [1] 2.102377e-08 | + | |
| - | > v.orig <- (v*sd(x))+mean(x) | + | |
| - | > v.orig | + | |
| - | [1] 50 | + | |
| - | > | + | |
| - | > plot(vs.orig, | + | |
| - | > | + | |
| - | > | + | |
| - | > | + | |
| - | </ | + | |
| - | </ | + | |
| - | <WRAP half column> | + | |
| - | comment | + | |
| - | {{: | + | |
| - | + | ||
| - | 만약에 처음에 구한 랜덤 v값이 평균의 오른 쪽에있었더라면, | + | |
| - | {{: | + | |
| - | </ | + | |
| - | </WRAP> | + | |
estimated_standard_deviation.1773119589.txt.gz · Last modified: by hkimscil
