Java 线性回归中的梯度下降
我试图用java实现线性回归。我的假设是θ0+θ1*x[i]。 我试图计算出θ0和θ1的值,这样成本函数是最小的。 我使用梯度下降法来找出值- 在Java 线性回归中的梯度下降,java,machine-learning,linear-regression,gradient-descent,Java,Machine Learning,Linear Regression,Gradient Descent,我试图用java实现线性回归。我的假设是θ0+θ1*x[i]。 我试图计算出θ0和θ1的值,这样成本函数是最小的。 我使用梯度下降法来找出值- 在 while(repeat until convergence) { calculate theta0 and theta1 simultaneously. } 在收敛之前,这种重复是什么? 我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激 我
while(repeat until convergence)
{
calculate theta0 and theta1 simultaneously.
}
在收敛之前,这种重复是什么?
我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么
我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激 我对梯度下降不太了解,但我们学习了另一种计算多点线性回归的方法: 但是,如果您确实想添加while循环,我建议您执行以下操作:
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
最终,θ0和θ1将收敛到某个值。这意味着,无论应用公式的频率有多高,它都将始终保持在该值附近。()
所以再次应用代码不会对θ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);
您需要在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
可以使用几个不同的条件来终止渐变下降搜索。例如,可以运行“渐变下降”
梯度下降法是一种用于最小化给定函数的迭代方法。我们从解的初始猜测开始,然后取函数在该点的梯度。我们沿着梯度的负方向逐步求解,然后重复这个过程。该算法最终将在梯度为零(对应于局部最小值)的位置收敛。所以你的工作就是找出使损失函数最小化的θ0和θ1的值[例如最小平方误差]。 术语“收敛”表示达到局部最小值,进一步迭代不会影响参数值,即θ0和θ1的值保持不变。让我们看一个示例注释:假设它位于此解释的第一象限 假设你必须最小化一个函数f(x)[你的例子中的成本函数]。为此,您需要找出使f(x)的函数值最小化的x的值。下面是使用梯度下降法求x值的逐步过程
x=x-[一些正值]
。这使得x更接近D[即最小值],并降低了f(x)的函数值[见图]。假设在迭代1之后,您到达点Bx=x-[0]
。您将获得相同的x[或与上一个x非常接近的值]。这种情况称为“收敛”。
上述步骤用于增加坡度,但同样适用于减小坡度。例如,点G处的梯度会导致一些负值。当您更新x时,即x=x-[负值]=x-[-一些正值]=x+一些正值。这会增加x的值,并使x接近点F[或接近最小值]iter = 0
while (iter < N) {
theta0 = theta0 - gradient with respect to theta0
theta1 = theta1 - gradient with respect to theta1
iter++
}
但由于它包含矩阵计算,显然当矩阵X的大小较大时,它比梯度下降运算的计算成本更高。
我希望这能回答你的问题。如果没有,请告诉我。梯度下降是一种优化算法(精确地说是最小化,最大化也有梯度上升)。在线性回归的情况下,我们最小化成本函数。它属于基于梯度的优化家族,其思想是当成本被负梯度减去时,会将其从成本曲面的山上带到最优解 在您的算法中,重复直到收敛意味着直到到达成本曲面/曲线中的最佳点,这是在某些迭代的梯度非常接近零时确定的。在这种情况下,该算法被称为收敛的(可能是局部最优的,很明显,梯度下降在许多情况下收敛到局部最优) 要确定算法是否收敛,可以执行以下操作:
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的注释:.首先将
theta[0]
和theta[1]
分配给某个任意值,然后计算假设值(theta[0]+theta[1]*x1)
,然后通过梯度下降算法计算theta[0]
和theta[1]
。由algo:
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])
其中alpha:学习率
J(theta[0],theta[1])=cost function
您将获得新的值o