【问题标题】:How to minimize step size in each iteration when using Gradient Descent Method (R)?使用梯度下降法(R)时如何最小化每次迭代的步长?
【发布时间】:2013-04-03 02:36:04
【问题描述】:

我写了一个 R 代码来使用下面的梯度下降法找到一个函数的最小值:

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

【问题讨论】:

  • 你得到的这个错误对你有什么意味着

标签: r optimization computer-science


【解决方案1】:

错误信息很清楚,您正在尝试使用变量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 也没有在任何地方定义,这你的函数f1g1 看起来有点奇怪,例如这是无效的代码:

 -logLike<- 0.5*n*log(theta[2])-(1/(2*theta[2]))*sum((x-theta[1])**2)

您正在尝试将某些内容分配给名为 -logLike 的变量,但您不能在变量名中使用 -

编辑:

查看optimize 的文档,了解函数返回的内容:

价值

包含最小(或最大)和目标组件的列表 最小值(或最大值)的位置和函数的值 那时。

因此,您的变量 min 包含两个元素,尽管您可能只需要代码下一行中的最小值。

【讨论】:

  • 感谢您的所有建议。最后一个等式仍然出现错误:min * newstep 中的错误:二进制运算符的非数字参数。我应该使用“as.numeric”来修复我的代码中的某些内容吗?谢谢。
  • 我使用了 edit(gradient.method) 但出现了一个包含原始代码的编辑窗口。检查编辑是什么意思?谢谢。
  • 再次感谢;但是,包含两个元素的“min”正是我所需要的。因此,代码最后一行的“newpair”也会有两个元素。如果函数“optimize”只能给出一个元素,我应该将“min”分为“min[1]”和“min[2]”以解决问题吗?
猜你喜欢
  • 2020-10-17
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2018-10-23
  • 2016-09-25
  • 1970-01-01
相关资源
最近更新 更多