我写了一个R代码,使用下面的Gradient Descent Method找到函数的最小值:
gradient.method <- function(f, grad, init, unit.fac=TRUE, interval=c(-7,10), tol=1e-11, max.iter = 35)
{
newpair <- init
oldpair <- newpair - 1
iter <- 0
while(iter < max.iter & sqrt(sum((newpair - oldpair)^2)) > tol){
iter <- iter + 1
oldpair <- newpair
#Set up the unit vector u
newstep <- if(unit.fac) grad(x)(oldpair)/sqrt(sum(grad(x)(oldpair)**2))
#Get minimum of f(x_0 - step_size*grad(x_0))
value <- function(step_size) oldpair - step_size*newstep
min <- optimize(f(x)(value(step_size)),interval)
#Get new pair of vector x
newpair <- oldpair - min*newstep
}
list(minimum = newpair, value = f(x)(newpair), nsteps = iter)
}
f和grad的函数如下:
f1 <- function(x){
n<-length(x)
function(theta){
-logLike<- 0.5*n*log(theta[2])-(1/(2*theta[2]))*sum((x-theta[1])**2)
}
}
g1 <- function(x){
n <- length(x)
function(theta){
grd1 <- -sum((x - theta[1])*theta[2])
grd2 <- n/(theta[2]) - 0.5*sum(x - theta[1])
}
}
但是,我在测试代码时遇到了一个错误:step_size。我该如何纠正这个问题?感谢。
res<-gradient.method(f=f1, grad=g1, init=c(100,100), max.iter=100)
Error in value(step_size) : object 'step_size' not found
答案 0 :(得分:0)
错误信息非常清楚,您正在尝试使用尚未在任何地方定义的变量step_size
。这个问题源于你没有正确使用optimize
函数的事实,你应该给它一个函数的名称,它的第一个参数最小化。来自optimize
的帮助页面(使用?optimize
):
f
要优化的功能。该功能最小化或 取决于最大值,最大化其第一个参数。
所以你应该像这样使用optimize
:
value <- function(step_size) oldpair - step_size*newstep
fn<-function(step_size) f(x)(value(step_size))
min <- optimize(fn,interval)
此外,变量x
未在任何地方定义,而且您的函数f1
和g1
看起来有点奇怪,例如这不是有效的代码:
-logLike<- 0.5*n*log(theta[2])-(1/(2*theta[2]))*sum((x-theta[1])**2)
您正尝试将某些内容分配给名为-logLike
的变量,但您不能在变量名中使用-
。
编辑:
检查optimize
关于函数返回的文档:
值
包含最小(或最大)和目标的组件的列表 最小(或最大)的位置和函数的值 那时候。
因此,您的变量min
包含两个元素,尽管您可能只需要代码下一行中的最小值。