Machine learning 梯度下降似乎失败了

Machine learning 梯度下降似乎失败了,machine-learning,octave,gradient-descent,Machine Learning,Octave,Gradient Descent,我实现了一个梯度下降算法来最小化代价函数,以便获得一个确定图像是否具有良好质量的假设。我是用八度音阶做的。这个想法是以Andrew Ng提出的算法为基础的 因此,我有880个值“y”,其中包含0.5到12之间的值。我有880个值,从50到300,在“X”中,可以预测图像的质量 不幸的是,该算法似乎失败了,经过一些迭代后,θ的值非常小,以至于θ0和θ1变成“NaN”。我的线性回归曲线有奇怪的值 下面是梯度下降算法的代码: (theta=0(2,1);,alpha=0.01,迭代次数=1500) 下

我实现了一个梯度下降算法来最小化代价函数,以便获得一个确定图像是否具有良好质量的假设。我是用八度音阶做的。这个想法是以Andrew Ng提出的算法为基础的

因此,我有880个值“y”,其中包含0.5到12之间的值。我有880个值,从50到300,在“X”中,可以预测图像的质量

不幸的是,该算法似乎失败了,经过一些迭代后,θ的值非常小,以至于θ0和θ1变成“NaN”。我的线性回归曲线有奇怪的值

下面是梯度下降算法的代码: (
theta=0(2,1);
,alpha=0.01,迭代次数=1500)

下面是costfunction的计算:

function J = computeCost(X, y, theta)   %

m = length(y); % number of training examples
J = 0;
tmp=0;
for i=1:m, 
    tmp = tmp+ (theta (1,1) + theta (2,1)*X(i,2) - y(i))^2; %differenzberechnung
end
J= (1/(2*m)) * tmp
end

我认为您的
computeCost
函数是错误的。 我去年参加了NG的课程,我有以下实现(矢量化):

对我来说,实现的其余部分似乎很好,不过您也可以将它们矢量化

theta_1 = theta(1) - alpha * (1/m) * sum((X*theta-y).*X(:,1));
theta_2 = theta(2) - alpha * (1/m) * sum((X*theta-y).*X(:,2));
之后,您将临时θ(这里称为θ1和θ2)正确地设置回“真实”θ


一般来说,矢量化比循环更有用,读取和调试也不那么麻烦。

我矢量化了θ的东西。。。 梅可以帮助别人

theta = theta - (alpha/m *  (X * theta-y)' * X)';

如果你同意使用最小二乘代价函数,那么你可以试着用正态方程代替梯度下降。它更简单——只有一行——而且计算速度更快

以下是正常方程:

以八度形式:

theta = (pinv(X' * X )) * X' * y

下面是一个教程,解释了如何使用法线方程:

虽然不像矢量化版本那样可伸缩,但基于循环的梯度下降计算应该会产生相同的结果。在上面的例子中,梯度下降无法计算正确θ的最可能的情况是alpha值


使用一组经过验证的成本和梯度下降函数以及一组与问题中描述的数据类似的数据,如果
alpha=0.01
,则在几次迭代后,θ最终会得到NaN值。但是,当设置为
alpha=0.000001
时,即使在100次迭代后,梯度下降也能按预期工作。

这里仅使用向量,是Mathematica中具有梯度下降的LR的紧凑实现:

Theta = {0, 0}
alpha = 0.0001;
iteration = 1500;
Jhist = Table[0, {i, iteration}];
Table[  
  Theta = Theta - 
  alpha * Dot[Transpose[X], (Dot[X, Theta] - Y)]/m; 
  Jhist[[k]] = 
  Total[ (Dot[X, Theta] - Y[[All]])^2]/(2*m); Theta, {k, iteration}]

注:当然,我们假设X是一个n*2矩阵,X[[1]]只包含1s'

如果您想知道如何将看似复杂的
for
循环矢量化并压缩为一个单行表达式,请继续阅读。矢量化形式为:

theta=theta-(α/m)*(X'*(X*theta-y))

下面详细解释了我们如何使用梯度下降算法得到矢量化表达式:

这是微调θ值的梯度下降算法:

假设给定了以下X、y和θ值:

  • m=培训示例的数量
  • n=特征数量+1

这里

  • m=5(培训示例)
  • n=4(特征+1)
  • X=m×n矩阵
  • y=m x 1向量矩阵
  • θ=n x 1向量矩阵
  • xi是第i个培训示例
  • xj是给定培训示例中的第j个功能
此外

  • h(x)=([x]*[θ])
    (我们的训练集的预测值的m x 1矩阵)
  • h(x)-y=([x]*[θ]-[y])
    (我们预测中的误差矩阵m x 1)
机器学习的全部目标是最小化预测中的错误。基于上述推论,我们的误差矩阵为
mx1
向量矩阵,如下所示:

要计算θj的新值,我们必须得到所有误差(m行)乘以训练集X的第j个特征值的总和。也就是说,取E中的所有值,分别与相应的训练示例的第j个特征相乘,并将它们相加。这将帮助我们得到θj的新值(希望更好)。对所有j或多个特征重复此过程。在矩阵形式中,这可以写成:

这可以简化为:

  • [E]'x[x]
    将给我们一个行向量矩阵,因为E'是1 x m矩阵,x是m x n矩阵。但是我们感兴趣的是得到一个列矩阵,因此我们转置结果矩阵
更简洁地说,它可以写成:

由于
(A*B)=(B'*A')
A'=A
,我们也可以将上述内容写成

这是我们最初的表达方式:

theta = theta - (alpha/m) * (X' * (X * theta - y))
这应该起作用:-

theta(1,1) = theta(1,1) - (alpha*(1/m))*((X*theta - y)'* X(:,1) ); 

theta(2,1) = theta(2,1) - (alpha*(1/m))*((X*theta - y)'* X(:,2) ); 

它这样更干净,而且也矢量化了

predictions = X * theta;
errorsVector = predictions - y;
theta = theta - (alpha/m) * (X' * errorsVector);

如果你还记得梯度下降形式机器学习课程的第一个Pdf文件,你会注意学习速度。这是提到的pdf中的注释

实施说明:如果您的学习率太高,J(θ)可以- 边缘和
blow up',导致数值对计算机来说太大
计算。在这些情况下,Octave/MATLAB将倾向于返回
南斯。NaN代表
不是一个数字”,通常由unde ned引起
涉及-无穷大和+无穷大的运算

谢谢;)(我去年也参加了这门课程,想找出当前问题的解决方案;),所以你的答案应该没问题;)顺便说一句,也许我忘记了,但第一个不应该是吗?theta_1=theta(1)-alpha*(1/m)*sum(X*theta-y)谢谢,我用了一个循环代替了矢量化,遇到了同样的问题,真是个救命稻草!商定的外观更智能,矢量化的表单也可跨多个功能进行扩展。这一点是正确的答案。另一种编写方法:
theta=theta-alpha/m*(X'*(X*theta-y))如果可能,最好使用矢量化。啊,太好了,
theta(1,1) = theta(1,1) - (alpha*(1/m))*((X*theta - y)'* X(:,1) ); 

theta(2,1) = theta(2,1) - (alpha*(1/m))*((X*theta - y)'* X(:,2) ); 
predictions = X * theta;
errorsVector = predictions - y;
theta = theta - (alpha/m) * (X' * errorsVector);