当前位置: 首页 > 知识库问答 >
问题:

线性回归中的梯度下降

寇开畅
2023-03-14

我试图在java中实现线性回归。我的假设是θ0θ1*x[i]。我试图计算θ0和θ1的值,使成本函数最小。我正在用梯度下降来找出值-

while(repeat until convergence)
{
   calculate theta0 and theta1 simultaneously.
}

在收敛之前,这种重复是什么?我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么?

我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激。

共有3个答案

龚振濂
2023-03-14

我对梯度下降不是很了解,但是我们学习了另一种计算线性回归的方法:

http://en.wikipedia.org/wiki/Simple_linear_regression#Fitting_the_regression_line

但是,如果您确实想添加while循环,我建议您执行以下操作:

最终,θ0和θ1将收敛到某个值。这意味着,无论应用公式的频率有多高,它都将始终保持在该值附近。(http://en.wikipedia.org/wiki/(ε,δ)-极限的定义。

所以再次应用代码不会对θ0和θ1有太大的改变,只会改变很小的量。或者:θ0(1)和下一个θ0(1)之间的差值小于某个量。

这就引出了以下代码:

double little = 1E-10;
do {
$theta0 = theta0;
$theta1 = theta1;
// now calculate the new theta0, theta1 simultaneously.
} while(Math.abs(theta0-$theta0) + Math.abs(theta1-$theta1)>little);
王英奕
2023-03-14

梯度下降是一种优化算法(精确地说是最小化,最大化也有梯度上升)。在线性回归的情况下,我们最小化成本函数。它属于基于梯度的优化家族,其思想是当成本被负梯度减去时,会将其从成本曲面的山上带到最优解。

在您的算法中,重复直到收敛意味着直到到达成本曲面/曲线中的最佳点,这是在某些迭代的梯度非常接近零时确定的。在这种情况下,该算法被称为收敛的(可能是局部最优的,很明显,梯度下降在许多情况下收敛到局部最优)

要确定算法是否收敛,可以执行以下操作:

calculate gradient
theta = theta -gradientTheta
while(True):
    calculate gradient
    newTheta = theta - gradient
    if gradient is very close to zero and abs(newTheta-Theta) is very close to zero:
       break from loop # (The algorithm has converged)
    theta = newTheta

有关线性回归和梯度下降以及其他优化的详细信息,您可以遵循Andrew Ng的注释:http://cs229.stanford.edu/notes/cs229-notes1.pdf.

方恺
2023-03-14

梯度下降是一种使给定函数最小化的迭代方法。我们从对解的初始猜测开始,我们在那一点上取函数的梯度。我们沿着梯度的负方向逐步求解,然后重复这个过程。该算法最终将收敛在梯度为零的地方(对应于局部最小值)。所以你的工作是找出θ0和θ1的值,最小化损失函数[例如最小二乘误差]。术语"收敛"意味着你达到了局部最小值,进一步的迭代不会影响参数的值,即θ0和θ1的值保持不变。让我们看一个例子注意:假设它在这个解释的第一象限。

假设你必须最小化一个函数f(x)[你的例子中的成本函数]。为此,您需要找出使f(x)的函数值最小化的x的值。下面是使用梯度下降法求x值的逐步过程

  1. 选择x的初始值。假设它在图中的A点。
  2. 在A处计算f(x)相对于x的梯度
  3. 这给出了函数在A点的斜率,因为函数在A点增加,它将产生正值。
  4. 你从x的初始猜测中减去这个正值,并更新x的值。即x=x-[一些正值]。这使得x更接近D[即最小值],并减少了f(x)[从图中]的函数值。假设在迭代1之后,您到达点B。
  5. 在B点,重复步骤4中提到的相同过程,到达C点,最后到达D点。
  6. 在D点,由于它是局部极小值,当你计算梯度时,你得到0[或非常接近0]。现在尝试更新x的值,即x=x-[0]。你会得到相同的x[或者非常接近前一个x的值]。这种情况被称为“收敛”。以上步骤用于增加坡度,但对于降低坡度同样有效。例如,G点的梯度会导致一些负值。当你更新x i. ex=x-[负值]=x - [ - 一些正值]=x一些正值。这增加了x的值,它使x接近点F[或接近最小值]。

有多种方法可以解决这种梯度下降。正如@mattnedrich所说,两种基本方法是

>

  • 使用固定的迭代次数N,对于这个伪html" target="_blank">代码将

    iter = 0
    while (iter < N) {
      theta0 = theta0 - gradient with respect to theta0
      theta1 = theta1 - gradient with respect to theta1
      iter++
    }
    

    梯度下降法是线性回归中最小化函数的方法之一。也有直接的解决办法。批处理(也称为正态方程)可用于在单个步骤中找出θ0和θ1的值。如果X是输入矩阵,y是输出向量,θ是要计算的参数,那么对于平方误差法,可以使用该矩阵方程在一个步骤中找到θ的值

    theta = inverse(transpose (X)*X)*transpose(X)*y
    

    但由于它包含矩阵计算,显然当矩阵X的大小较大时,它比梯度下降运算的计算成本更高。我希望这能回答你的问题。如果没有,请告诉我。

  •  类似资料:
    • 我试图在MatLab中实现一个函数,该函数使用牛顿法计算最佳线性回归。然而,我陷入了一个问题。我不知道如何求二阶导数。所以我不能实施它。这是我的密码。 谢谢你的帮助。 编辑:: 我用一些纸和笔解决了这个问题。你所需要的只是一些微积分和矩阵运算。我找到了二阶导数,它现在正在工作。我正在为感兴趣的人分享我的工作代码。

    • 我用JavaScript实现了一个非常简单的线性回归和梯度下降算法,但是在查阅了多个源代码并尝试了几件事情之后,我无法使它收敛。 数据是绝对线性的,只是数字0到30作为输入,x*3作为正确的输出来学习。 这就是梯度下降背后的逻辑: 我从不同的地方取了公式,包括: 乌达城深度学习基金会纳米学位的练习 吴恩达的线性回归梯度下降课程(也在这里) 斯坦福CS229讲义 我从卡内基梅隆大学找到的其他PDF幻

    • 在机器学习课程https://share.coursera.org/wiki/index.php/ML:Linear_Regression_with_Multiple_Variables#Gradient_Descent_for_Multiple_Variables中,它说梯度下降应该收敛。 我正在使用scikit学习的线性回归。它不提供梯度下降信息。我已经看到了许多关于stackoverflow

    • 我试图实现梯度下降的线性回归,如本文(https://towardsdatascience.com/linear-regression-using-gradient-descent-97a6c8700931)所述。我已经严格遵循了实现,但是经过几次迭代后,我的结果会溢出。我试图得到这个结果大约: y=-0.02x 8499.6。 代码: 在这里,它可以在围棋场上工作:https://play.go

    • 我正在学习机器学习/线性回归的Coursera课程。下面是他们如何描述用于求解估计OLS系数的梯度下降算法: 因此,他们对系数使用,对设计矩阵(或他们称之为特征)使用,对因变量使用。它们的收敛准则通常是RSS梯度的范数小于容差ε;也就是说,他们对“不收敛”的定义是: 我很难让这个算法收敛,我想知道在我的实现中是否忽略了一些东西。下面是代码。请注意,我还通过statsmodels回归库运行了我在其中

    • 好的,那么这个算法到底意味着什么呢? 据我所知: i) 阿尔法:梯度下降的步骤有多大。 ii)现在,∑{hTheta[x(i)]-y(i)}:指给定θ值的总误差。 误差是指预测值{hTheta[x(i)]}与实际值之间的差值。[y(i)] σ{hTheta[x(i)]-y(i)}给出了所有训练示例中所有误差的总和。 结尾的Xj^(i)代表什么? 在为多元线性回归实现梯度下降时,我们是否在执行以下操