线性回归中的梯度下降

时间:2014-01-11 15:21:05

标签: java machine-learning linear-regression gradient-descent

我正在尝试在java中实现线性回归。我的假设是theta0 + theta1 * x [i]。 我试图找出theta0和theta1的值,以便成本函数最小。 我使用渐变下降来找出值 -

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

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

我是机器学习的新手,刚开始编写基本的算法以便更好地理解。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:15)

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

enter image description here

让我们说你必须最小化函数f(x)[在你的情况下的成本函数]。为此,您需要找出最小化f(x)函数值的x值。以下是使用梯度下降法

找出x值的分步过程
  1. 您选择x的初始值。让我们说这是图中的A点。
  2. 您计算f(x)相对于A处的x的梯度。
  3. 这给出了A点函数的斜率。由于函数在A处增加,它将产生正值。
  4. 从x的初始猜测中减去此正值并更新x的值。即x = x - [Some positive value]。这使x更接近D [即最小]并减少f(x)的函数值[来自图]。让我们说在迭代1之后,你到达B点。
  5. 在B点,您重复与步骤4中提到的相同的过程并到达C点,最后点D.“
  6. 在D点,因为它是局部最小值,所以当你计算渐变时,你会得到0 [或非常接近0]。现在您尝试更新x的值,即x = x - [0]。你将得到相同的x [或更接近前一个x的值]。这种情况被称为"融合"。 上述步骤用于增加斜率,但对于减小斜率同样有效。例如,G点处的梯度会产生一些负值。更新x即x = x - [ negative value] = x - [ - some positive value] = x + some positive value时。这会增加x的值,并使x接近F [或接近最小值]。
  7. 有多种方法可以解决这种梯度下降问题。正如@mattnedrich所说,这两种基本方法是

    1. 使用固定的迭代次数N,因为这个伪代码将是

      iter = 0
      while (iter < N) {
        theta0 = theta0 - gradient with respect to theta0
        theta1 = theta1 - gradient with respect to theta1
        iter++
      }
      
    2. 重复直到theta0和theta1的两个连续值几乎相同。伪代码由@Gerwin在另一个答案中给出。
    3. 梯度下降是使线性回归中的函数最小化的方法之一。也有直接的解决方案。批处理(也称为正规方程)可用于在单个步骤中找出theta0和theta1的值。如果X是输入矩阵,y是输出向量,θ是你想要计算的参数,那么对于平方误差方法,你可以使用这个矩阵方程在一个步骤中找到theta的值

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

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

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:1)

我不太了解渐变下降,但我们学会了另一种用多个点计算线性回归的方法:

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

但是如果你真的想添加while循环,我推荐以下内容:

最终,theta0和theta1将收敛到某个值。这意味着,无论您何时应用公式,它都将始终保持在该值附近。 (http://en.wikipedia.org/wiki/(%CE%B5,_%CE%B4)-definition_of_limit)。

因此,再次应用代码不会非常改变theta0和theta1,只是非常少量。或者:theta0(1)和下一个theta0(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);

答案 3 :(得分:1)

您需要在while循环内执行以下操作:

while (some condition is not met)
    // 1) Compute the gradient using theta0 and theta1
    // 2) Use the gradient to compute newTheta0 and newTheta1 values
    // 3) Set theta0 = newTheta0 and theta1 = newTheta1

您可以使用几种不同的标准来终止渐变下降搜索。例如,您可以运行渐变下降

  1. 对于固定次数的迭代
  2. 直到(theta0,theta1)的梯度值足够接近零(表示最小值)
  3. 每次迭代都应该越来越接近最佳解决方案。也就是说,如果你计算每次迭代的错误(theta0,theta1模型预测你的数据的程度),它应该越来越小。

    要了解有关如何实际编写此代码的更多信息,请参阅:
    https://www.youtube.com/watch?v=CGHDsi_l8F4&list=PLnnr1O8OWc6ajN_fNcSUz9k5gF_E9huF0 https://www.youtube.com/watch?v=kjes46vP5m8&list=PLnnr1O8OWc6asSH0wOMn5JjgSlqNiK2C4

答案 4 :(得分:1)

最初将theta[0]theta[1]分配给某个任意值,然后计算您的假设(theta[0] +theta[1]*x1)的值,然后通过梯度下降算法计算theta[0]和{{ 1}}。通过算法:

theta[1]

其中alpha:学习率

theta[0](new) = theta[0](old) - alpha*[partialderivative(J(theta[0],theta[1]) w.r.t theta[0])

theta[1](new) = theta[1](old) - alpha*[partialderivative(J(theta[0],theta[1]) w.r.t theta[1])

您将获得J(theta[0],theta[1])=cost function theta[0]的新值。然后,您需要再次计算您的假设的新值。重复此计算theta[1]theta[0]的过程,直到theta[1]theta[i](new)之间的差异小于theta[i](old)

详情请参阅:http://cs229.stanford.edu/notes/cs229-notes1.pdf