我正在使用 R 編程語言。使用這里的鏈接
x = seq(1,1000, by=1)
y = (x^3) - (2*x) -5
gdec.eta1 = gradientR(y = y, X = x, eta = 100, iters = 1000)
但是,我收到以下錯誤:
Error in if (sqrt(sum(grad^2)) <= epsilon) { :
missing value where TRUE/FALSE needed
有人可以告訴我我做錯了什么嗎?為什么會產生錯誤?
有誰知道 R 中的其他一些梯度下降函式是否允許你“直接”優化這個函式而不是從這個函式生成點?
像這樣的東西:
func2 <- function(x) {
x^3 - 2* x - 5
}
gradientR(func2, eta = 100, iters = 1000)
有誰知道這是否可能?
謝謝!
Note: This works for the following example (from the website linked above):
> y = rnorm(n = 10000, mean = 0, sd = 1)
> x1 = rnorm(n = 10000, mean = 0, sd = 1)
> x2 = rnorm(n = 10000, mean = 0, sd = 1)
> x3 = rnorm(n = 10000, mean = 0, sd = 1)
> x4 = rnorm(n = 10000, mean = 0, sd = 1)
> x5 = rnorm(n = 10000, mean = 0, sd = 1)
>
> ptm <- proc.time()
> gdec.eta1 = gradientR(y = y, X = data.frame(x1,x2,x3, x4,x5), eta = 100, iters = 1000)
[1] "Initialize parameters..."
[1] "Algorithm converged"
[1] "Final gradient norm is 9.80308529574335e-05"
I just don't know why it doesn't work for my example.
uj5u.com熱心網友回復:
我們假設 gradientR 解決了您遇到的問題,問題是讓它與您的輸入一起作業。這里有幾個問題:
不能將函式傳遞給梯度R。y 和 X 必須是向量或矩陣。
如果您給它們提供非常不同的數字,許多優化問題都會出現縮放問題。這個沒什么不同。使用 x/1000 代替 x。
只是為了弄清楚要解決的潛在問題是什么,它是找到一個系數向量 b 使得殘差向量的平方
y - cbind(1, x) %% b和在已知 y 和 x 的情況下最小化。一些評論者對問題的解釋不同,但如果他們的解釋是你想要的,那么梯度R 不適用,無論如何,最大化或最小化 x^3-2x-5 的問題沒有有限的解決方案。如果您想傳遞 func 而不是 y,那么只需撰寫一個簡單的包裝器 grad2,如下所示。
要解決縮放問題,請使用 x/1000 和 y,如圖所示。
x = seq(1, 1000, by = 1) / 1000
y = (x^3) - (2*x) -5
gdec.eta1 = gradientR(y = y, X = x, eta = 100, iters = 1000)
str(gdec.eta1)
## List of 2
## $ coef : num [1:2, 1] -5.2 -1.1 <----------------
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:2] "rep.1..length.y.." "X"
## .. ..$ : NULL
## $ l2loss: num [1:260] 101.44 50.34 25.5 13.83 8.86 ...
# check that lm gives the same coefficients
coef(lm(y ~ x))
## (Intercept) x
## -5.200701 -1.098500 <----------------
現在定義一個接受 func 而不是 y 的函式。func 必須滿足 func(x) 為 y。我們在最后對其進行了測驗,它給出了相同的結果。
# func must be such that func(X) gives Y
grad2 <- function(func, X, ...) gradientR(func(X), X, ...)
# test
x = seq(1, 1000, by = 1) / 1000
func <- function(x) (x^3) - (2*x) -5
grad2 <- function(func, ...) gradientR(func(x), ...)
gdec.etal2 <- grad2(func, x, eta = 100, iters = 1000)
str(gdec.etal2)
## List of 2
## $ coef : num [1:2, 1] -5.2 -1.1 <----------------
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:2] "rep.1..length.y.." "X"
## .. ..$ : NULL
## $ l2loss: num [1:238] 141.66 69.93 34.71 17.59 9.57 ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/412394.html
標籤:
