【发布时间】:2016-11-02 08:25:29
【问题描述】:
我为梯度下降算法编写了下面的代码。我收到一个错误,谁能告诉我为什么以及如何解决它?
gradient <- function(h, start, alpha = 0.01, tolerance = 0.0001, debug = FALSE) {
MAXITER <- 1000
x_old <- start
iter <- 0
cat("gradient descent minimization =\n")
if (debug == TRUE) cat("iter=", iter,", value=", x_old, "\n")
repeat {
iter <- iter + 1
x_new <- x_old - alpha*h(x_old)
if (debug == TRUE) cat("iter=", iter,", value=", x_new, "\n")
if (abs(x_old - x_new) < tolerance) break
if (iter > MAXITER) break
x_old <- x_new
}
cat("total number of interations =", iter, "\n")
cat("last diference =", abs(x_old - x_new), "\n")
cat("final value =", x_new, "\n")
cat("final function value =", h(x_new), "\n")
}
h <- function(x){ x^4 - 8*x^2 + 2*x }
gradient(h, -5, tolerance = 0.0001)
...
gradient descent minimization =
Error in if (abs(x_old - x_new) < tolerance) break :
missing value where TRUE/FALSE needed
【问题讨论】:
-
选择你的代码然后按Ctrl-K缩进就这么难吗?
-
文体点:而不是
iter <- 0; ... repeat { iter <- iter + 1; ... if (iter > MAXITER) break ...}只是一个变相的for循环:for (iter in 1:MAXITER) { ... } -
您为什么不尝试拨打
gradient(..., debug = TRUE)?打印语句使答案立即跳出。这真的是你自己的代码吗?我对此表示怀疑。 -
您可以可视化您的 gradient function h in WolframAlpha ,这将帮助您调试如果您从 x_start = -5 开始会发生什么。其实我们应该看the integral of h dx,而不是梯度h。
标签: r optimization gradient-descent