使用梯度下降(最速下降)估计线性回归

2024-06-26

示例数据

X<-matrix(c(rep(1,97),runif(97)) , nrow=97, ncol=2)
y<-matrix(runif(97), nrow= 97 , ncol =1)

我已经成功创建了成本函数

COST<-function(theta,X,y){
### Calculate half MSE 
    sum((X %*% theta - y)^2)/(2*length(y))
}

然而,当我运行这个函数时,它似乎无法收敛超过 100 次迭代。

theta <- matrix (0, nrow=2,ncol=1)
num.iters <- 1500
delta = 0 

GD<-function(X,y,theta,alpha,num.iters){
    for (i in num.iters){

        while (max(abs(delta)) < tolerance){

            error <- X %*% theta - y
            delta <- (t(X) %*% error) / length(y)
            theta <- theta - alpha * delta
            cost_histo[i] <- COST(theta,X,y)
            theta_histo[[i]] <- theta

  }
  }
        return (list(cost_histo, theta_histo))
  }

有人能帮我吗 ?

Cheers


您的实现的算法部分是正确的。问题出在

  • 循环结构在GD是不正确的;这for循环是多余的,变量缺乏正确的初始化。
  • 使用固定的梯度下降的简单实现alpha很危险。通常建议这样alpha应该选择足够小的值,以希望我们总是向下搜索目标函数。然而,这种情况在实践中很少见。例如,多小才足够?如果它很小,那么收敛速度就是一个问题;如果它很小,那么收敛速度就是一个问题。但如果它很大,我们可能会陷入“之字形”搜索路径甚至发散!

Here is 梯度下降的稳健版本,用于估计线性回归。改进来自于步长减半策略,以避免“之字形”或背离。请参阅代码中的注释。在这种策略下,使用大的alpha. 保证了收敛性。

# theta: initial guess on regression coef
# alpha: initial step scaling factor
GD <- function(X, y, theta, alpha) {
  cost_histo <- numeric(0)
  theta_histo <- numeric(0)
  # an arbitrary initial gradient, to pass the initial while() check
  delta <- rep(1, ncol(X))
  # MSE at initial theta
  old.cost <- COST(theta, X, y)
  # main iteration loop
  while (max(abs(delta)) > 1e-7) {
    # gradient 
    error <- X %*% theta - y
    delta <- crossprod(X, error) / length(y)
    # proposal step
    trial.theta <- theta - alpha * c(delta)
    trial.cost <- COST(trial.theta, X, y)
    # step halving to avoid divergence
    while (trial.cost >= old.cost) {
      trial.theta <- (theta + trial.theta) / 2
      trial.cost <- COST(trial.theta, X, y)
      }
    # accept proposal
    cost_histo <- c(cost_histo, trial.cost)
    theta_histo <- c(theta_histo, trial.theta)
    # update old.cost and theta
    old.cost <- trial.cost
    theta <- trial.theta
    }
  list(cost_histo, theta_histo = matrix(theta_histo, nrow = ncol(X)))
  }

返回时,

  • 的长度cost_histo告诉您已经进行了多少次迭代(不包括步骤减半);
  • 的每一列theta_histo gives theta每次迭代。

事实上,步长减半大大加快了收敛速度。如果您使用更快的计算方法,您可以获得更高的效率COST。 (对于大型数据集最有用。请参阅https://stackoverflow.com/a/40228894/4891738 https://stackoverflow.com/a/40228894/4891738)

COST<-function(theta,X, y) {
  c(crossprod(X %*% theta - y)) /(2*length(y))
  }

现在,让我们考虑一下它在您的示例中的实现X, y.

oo <- GD(X, y, c(0,0), 5)

经过 107 次迭代后收敛。我们可以查看MSE的踪迹:

plot(oo[[1]])

请注意,在前几步,MSE 下降得非常快,但随后几乎持平。这揭示了梯度下降算法的根本缺点:随着我们越来越接近最小值,收敛速度越来越慢。

现在,我们提取最终的估计系数:

oo[[2]][, 107]

我们还可以将其与 QR 分解的直接估计进行比较:

.lm.fit(X, y)$coef

他们非常接近。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用梯度下降(最速下降)估计线性回归 的相关文章

随机推荐

  • 使用 gtk+ 播放视频

    您对使用 GTK 播放视频有什么建议吗 对于在 GTK 和其他 GTK 绑定上播放视频 您有很多选择 选项 使用第三方库 1 尝试使用ogmrip gtk http ogmrip sourceforge net en manual html
  • React-Three/Fiber 创建 3D 文本

    我正在尝试使用 Threejs React Three Fiber 创建 3D 文本 我使用字体加载器加载字体 如下所示 const font new FontLoader parse Microsoft Tai Le Regular js
  • 使用 fn:random-number-generator 多次生成随机数

    我尝试编写一个简单的函数 以便每次调用它时都为我提供一个随机字母 但我很难将我的想法与函数式编程方法的概念结合起来 一路上的一些帮助将不胜感激 我的代码如下所示
  • 带图标的 Android ContextMenu 选项

    Hi All 我有一个简单的问题 是否可以将带有图标的菜单项添加到上下文菜单中 我搜索过这个问题 发现这是不可能的 但是在 Android 设备的主屏幕中 当我长按时 会显示 添加到主屏幕 上下文菜单 其中包含带有文本的菜单项和图标 所以我
  • 没有jquery的动画,左右滑动

    我试图在显示 div 时将其向左滑动 在隐藏它时将其向右滑动 但我不想使用 jQuery 有没有一种方法可以在不使用javascript库的情况下制作简单的动画并支持IE7和IE8 这是我的显示 隐藏js function showHide
  • 检测 html 元素内的用户选择

    如何检测用户选择 用鼠标突出显示 是否在某个元素内 某个元素的子元素 Example div sdfsdf div some span content span div sdfsd div 伪代码 if window getSelectio
  • 如何在 Windows 7 - 64 位中安装 IBM db2 ODBC 驱动程序?

    我需要从本地 SQL Server 2008 R2 连接到远程 DB2 我不想使用链接服务器 因此 我正在搜索下载并尝试安装 IBM DB2 驱动程序 因为主机集成服务器附带的用于 DB2 的 Microsoft ODBC 驱动程序非常昂贵
  • Git core.safecrlf 对具有相同行结尾的文件有不同的行为

    我有带有 VS 项目的 Windows 计算机 并且使用 Visual Studio 和 Cygwin 环境中的工具 包括 Git 有时 编辑后我会在文件中得到不同的行结尾 我想要简单的解决方案来检查文件的行尾一致性 然后再将其发送到存储库
  • 在添加 ApiController 属性之前,ASP.NET Core 3.1 无法处理 Axios 请求

    我有以下问题 每当我向 Api 端点发送内容时 ASP NET Core 3 1 就无法处理该请求 但是 当我添加ApiController属性它工作得很好 我的代码是正确的 但只有当我添加此属性时才有效 怎么会这样呢 作为参考 这是我的代
  • 如何使用Javascript统计通过ajax返回的
  • 的数量?
  • 我有一个 ajax 代码 它将列表项返回为 li one li li Two li 每次都会返回不同数量的 li 的 我想查一下数量 li li 它返回 如何使用 JavaScript 检查它 给你 returnedHTML find li
  • 一次设置多个字段/向单元结构添加新字段

    我有一个 1xn 结构 该结构包含一些带有数字单元格的字段 并非每个结构都具有相同的字段 所以我想将缺少的字段添加到结构中 但我没明白 Mimimal example I have same cells imported from csv
  • 如何确定 n 高数字金字塔中的最大路线成本

    我有一个像这样的数字金字塔 7 4 8 1 8 9 2 4 6 7 4 6 7 4 9 4 9 7 3 8 8 routes 32 每个数字都按其系列中的强大程度进行索引 0 9 gt 1 1 8 gt 5 2 8 gt 4 3 7 gt
  • COM Interop 挂起会冻结整个 COM 系统。如何取消COM调用

    我正在使用通过 COM Interop 包装器公开的第三方 dll 然而 其中一个 COM 调用经常冻结 至少不会返回 为了至少让我的代码更加健壮 我异步包装了调用 getDeviceInfoWaiter is a ManualResetE
  • 在 IOS 设备上制作动画时,2 个相互堆叠的动画元素会发生变化(z 索引位置)吗?

    JSFIDDLE http fiddle jshell net 6gdrQ 18 我有 2 个动画元素 一种是简单的旋转脚本 它像硬币一样旋转徽标的中间部分 另一个动画是中间部分翻转时您看到的徽标后面的粒子画布烟雾动画 我遇到的问题是画布烟
  • boost::bind 会导致开销吗?

    我目前正在从事网络软件方面的工作 它有一个主要类 server这显然代表一个服务器实例 A server实例可以发送请求 并通过回调通知用户响应 代码如下 class server public typedef boost function
  • 在带有 OR 条件的 LEFT JOIN 中使用索引

    考虑以下查询 SELECT FROM table1 LEFT JOIN table2 ON table2 some primary key table1 some primary key LEFT JOIN table3 ON table3
  • Haskell 程序查找列表中元素的位置

    我需要编写一个函数来查找列表中一个特定元素的位置 我是这样写的 findPos list elt list 1 head list elt 0 otherwise 1 findPos tail list elt 但是如果列表中元素重复怎么办
  • FileManager 说文件不存在

    我有一个用例需要UIImage保存到文档目录 然后UIImage需要转换为PDF并保存到文档目录 转换为 PDF 的代码 var filePath NSString string self selectedMedia imagePath i
  • 作为服务运行时,URLDownloadToFile() 将对象写入缓存中

    我有一个软件 可以将图像下载到工作目录中 然后对其进行处理以创建视频 之后 这些文件将被独立脚本删除 问题是它还将文件写入以下目录 该软件作为系统服务运行 C Windows SysWOW64 config systemprofile Ap
  • 使用梯度下降(最速下降)估计线性回归

    示例数据 X lt matrix c rep 1 97 runif 97 nrow 97 ncol 2 y lt matrix runif 97 nrow 97 ncol 1 我已经成功创建了成本函数 COST lt function th