我试图在java中实现线性回归.我的假设是theta0 + theta1*x [i].我试图找出theta0和theta1的值,以便成本函数最小.我使用渐变下降来找出价值 -
在里面
while(repeat until convergence) { calculate theta0 and theta1 simultaneously. }
什么是重复直到收敛?我知道它是局部最小值,但是我应该在while循环中放入什么样的代码?
我是机器学习的新手,刚开始编写基本的算法以便更好地理解.任何帮助将不胜感激.
梯度下降是用于最小化给定函数的迭代方法.我们从解决方案的初始猜测开始,然后在该点采用函数的梯度.我们在梯度的负方向上逐步解决该问题,然后重复该过程.该算法最终将收敛于梯度为零的位置(对应于局部最小值).所以你的工作是找出最小化损失函数的θ0和θ1的值[例如最小平方误差].术语"收敛"意味着您达到了局部最小值,并且进一步迭代不会影响参数值,即theta0和theta1的值保持不变.让我们看一个例子注意:假设它在这个解释的第一象限.
假设您必须最小化函数f(x)[在您的情况下的成本函数].为此,您需要找出最小化f(x)函数值的x值.以下是使用梯度下降法找出x的值的分步过程
您选择x的初始值.让我们说这是图中的A点.
您可以计算f(x)相对于A处的x的梯度.
这给出了A点处函数的斜率.由于函数在A处增加,它将产生正值.
您从x的初始猜测中减去此正值并更新xie的值x = x - [Some positive value]
.这使得x越接近D [即最小]并且减小f(x)的函数值[来自图].让我们说在迭代1之后,你到达B点.
在B点,重复与步骤4中提到的相同的过程并到达C点,最后点D.
在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 [或接近最小值].
有多种方法可以解决这种梯度下降问题.正如@mattnedrich所说,两种基本方法是
使用固定的迭代次数N,对于这个伪代码将是
iter = 0 while (iter < N) { theta0 = theta0 - gradient with respect to theta0 theta1 = theta1 - gradient with respect to theta1 iter++ }
重复直到theta0和theta1的两个连续值几乎相同.伪代码由@Gerwin在另一个答案中给出.
梯度下降是使线性回归中的函数最小化的方法之一.也有直接的解决方案.批处理(也称为正规方程)可用于在单个步骤中找出theta0和theta1的值.如果X是输入矩阵,y是输出向量,θ是要计算的参数,那么对于平方误差方法,您可以使用此矩阵方程在一个步骤中找到theta的值
theta = inverse(transpose (X)*X)*transpose(X)*y
但是由于这包含矩阵计算,显然当矩阵X的大小很大时,它的计算成本更高,然后是梯度下降.我希望这可以回答你的问题.如果没有,请告诉我.