Java 线性回归中的梯度下降

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循环中输入的确切代码是什么 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激 我

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

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模型预测数据的能力),误差应该越来越小

    要了解有关如何实际编写此代码的更多信息,请参阅:

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

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

  • 选择x的初始值。假设它在图中的A点
  • 计算f(x)在A处相对于x的梯度
  • 这给出了函数在点A处的斜率。由于函数在点A处增加,因此将产生正值
  • 从x的初始猜测中减去这个正值,然后更新x的值。i、 e.
    x=x-[一些正值]
    。这使得x更接近D[即最小值],并降低了f(x)的函数值[见图]。假设在迭代1之后,您到达点B
  • 在B点,重复步骤4中提到的相同过程,到达C点,最后到达D点
  • 在点D,因为它是局部最小值,当你们计算梯度时,你们得到0[或者非常接近于0]。现在您尝试更新x的值,即
    x=x-[0]
    。您将获得相同的x[或与上一个x非常接近的值]。这种情况称为“收敛”。 上述步骤用于增加坡度,但同样适用于减小坡度。例如,点G处的梯度会导致一些负值。当您更新x时,即x=x-[负值]=x-[-一些正值]=x+一些正值。这会增加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++
    }
    
    但由于它包含矩阵计算,显然当矩阵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