我正在尝试在java中实现线性回归。我的假设是theta0 + theta1 * x [i]。 我试图找出theta0和theta1的值,以便成本函数最小。 我使用渐变下降来找出值 -
在
中while(repeat until convergence)
{
calculate theta0 and theta1 simultaneously.
}
在收敛之前这是什么重复? 我知道它是局部最小值,但是我应该在while循环中放入什么样的代码?
我是机器学习的新手,刚开始编写基本的算法以便更好地理解。任何帮助将不胜感激。
答案 0 :(得分:15)
梯度下降是一种最小化给定函数的迭代方法。我们从解决方案的初始猜测开始,然后在该点采用函数的梯度。我们在梯度的负方向上逐步解决该问题,然后重复该过程。该算法最终将收敛于梯度为零的位置(对应于局部最小值)。所以你的工作是找出最小化损失函数的θ0和θ1的值[例如最小平方误差]。 术语"收敛"意味着你达到局部最小值并且进一步迭代不影响参数值,即theta0和theta1的值保持不变。让我们看一个例子注意:假设它在这个解释的第一象限。
让我们说你必须最小化函数f(x)[在你的情况下的成本函数]。为此,您需要找出最小化f(x)函数值的x值。以下是使用梯度下降法
找出x值的分步过程x = x - [Some positive value]
。这使x更接近D [即最小]并减少f(x)的函数值[来自图]。让我们说在迭代1之后,你到达B点。x = x - [0]
。你将得到相同的x [或更接近前一个x的值]。这种情况被称为"融合"。
上述步骤用于增加斜率,但对于减小斜率同样有效。例如,G点处的梯度会产生一些负值。更新x即x = x - [ negative value] = x - [ - some positive value] = x + some positive value
时。这会增加x的值,并使x接近F [或接近最小值]。有多种方法可以解决这种梯度下降问题。正如@mattnedrich所说,这两种基本方法是
使用固定的迭代次数N,因为这个伪代码将是
iter = 0
while (iter < N) {
theta0 = theta0 - gradient with respect to theta0
theta1 = theta1 - gradient with respect to theta1
iter++
}
梯度下降是使线性回归中的函数最小化的方法之一。也有直接的解决方案。批处理(也称为正规方程)可用于在单个步骤中找出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
您可以使用几种不同的标准来终止渐变下降搜索。例如,您可以运行渐变下降
每次迭代都应该越来越接近最佳解决方案。也就是说,如果你计算每次迭代的错误(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)