r - 在 R 中实现梯度下降时的问题
问题描述
我在 R 中为指数函数实现梯度下降时遇到问题。
比方说
foo <- function(x) {
y = -2 + 2.5 * exp(0.1*x^2-0.7*x)
return(y) }
那是我的指数函数
grad <- function(x) {
y = 2.5*exp(0.1*x^2-0.7*x)*(0.2*x-0.7)
return(y) }
是 foo(x) 的梯度函数。
任务是实现一个名为
gdescent <- function(x0, fc, grd, diff, step) {}
在哪里
- x0 是一个随机初始值
- foo 是我要最小化的指数函数
- grad 是梯度函数(foo(x) 的导数)
- diff 是终止算法的差异
- step 是步长的大小(即学习率)
该函数的结果应该是一个列表,其中包含
- par - x 的最小值;
- value - foo(par) 对应的最小值;
- 和iter - 算法找到最小值所需的迭代次数。
每次迭代后的更新规则为:
xi+1 = xi - step * grd(xi) # i didn't understand this at all
我如何在 R 中实现它?
到目前为止我对梯度下降法的理解:
- 选择一个随机初始值 x0 在梯度函数 grd(x) 中插入 x0
- 如果 grd(x0) < 0,则将 x0 减少“步”(x0+1=x0-步);
- 如果 grd(x0) > 0,则将 x0 增加“步长”(x0+1=x0+步长);并返回 2) 以 x0+1 作为初始值
到目前为止我的解决方案:
gdescent <- function(x0, fc, grd, diff, step) {
x = x0
x_history = vector("numeric", iter)
for(i in 1:iter) {
x = x - step * grad(x)
if( x > diff ) { #not sure how to proceed here
}
}
如果没有固定数量的迭代,我该如何解决这个问题?所以没有初始化iter
解决方案
推荐阅读
- javascript - 通过 cloudflare worker 使用相同的 URL 提供不同的缓存版本
- c# - 是否可以在 DataTable.Compute 表达式中使用局部变量作为过滤器?
- c# - 无法使用图形 API 发送邮件
- javascript - 按顺序提取文本标签 - 如何做到这一点?
- python-3.x - 如何编辑我的代码以使“下一步”按钮指向同一窗口中的空白页面?(不是新窗口)
- javascript - 未捕获的类型错误:无法在 Object.addListitem、ctrlAddItem、HTMLDocument 处读取 null- 的属性“insertAdjacentHTML”
- python - 无法将数据帧的 RPYC netref 转换为局部变量
- java - 将基于游标的节点遍历限制为传出边
- angular - 将角度路由映射到键是路径属性的类型
- sorting - 为什么 sort -u 或 uniq 不删除串联文本文件中的重复项?