梯度下降似乎失败了
gradient-descent
machine-learning
8
0

我实现了梯度下降算法,以最小化成本函数,从而获得用于确定图像质量是否良好的假设。我在Octave中做到了。这个想法以某种方式基于Andrew Ng的机器学习课程中的算法

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

可悲的是,该算法似乎失败了,经过几次迭代,theta的值是如此之小,以至于theta0和theta1变成了“ NaN”。我的线性回归曲线的值很奇怪...

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

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters


    tmp_j1=0;
for i=1:m, 
    tmp_j1 = tmp_j1+ ((theta (1,1) + theta (2,1)*X(i,2)) - y(i));
end

    tmp_j2=0;
for i=1:m, 
    tmp_j2 = tmp_j2+ (((theta (1,1) + theta (2,1)*X(i,2)) - y(i)) *X(i,2)); 
end

    tmp1= theta(1,1) - (alpha *  ((1/m) * tmp_j1))  
    tmp2= theta(2,1) - (alpha *  ((1/m) * tmp_j2))  

    theta(1,1)=tmp1
    theta(2,1)=tmp2

    % ============================================================

    % Save the cost J in every iteration    
    J_history(iter) = computeCost(X, y, theta);
end
end

这是成本函数的计算:

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
参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

我将theta矢量化了...可能可以帮助某人

theta = theta - (alpha/m *  (X * theta-y)' * X)';
收藏
评论

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

m = length(y);
J = 0;
predictions = X * theta;
sqrErrors = (predictions-y).^2;

J = 1/(2*m) * sum(sqrErrors);

尽管您也可以将它们向量化,但其余的实现对我来说似乎还不错。

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));

然后,将正确的临时theta(此处称为theta_1和theta_2)正确设置回“真实” theta。

通常,矢量化而不是循环更有用,读取和调试的烦恼也较小。

收藏
评论

如果您可以使用最小二乘成本函数,则可以尝试使用法线方程代替梯度下降。它要简单得多-只有一行-并且计算速度更快。

这是正常方程式: http : //mathworld.wolfram.com/NormalEquation.html

并以八度形式:

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

这是说明如何使用正规方程的教程: http : //www.lauradhamilton.com/tutorial-linear-regression-with-octave

收藏
评论

如果你想知道如何在看似复杂的寻找for循环进行矢量化 ,并挤在一个单一的一条线表达式,那么请继续往下看。向量化形式为:

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

下面给出了有关如何使用梯度下降算法得出此矢量化表达式的详细说明:

这是梯度下降算法,用于微调θ的值: 在此处输入图片说明

假设给出以下X,y和θ值:

  • m =训练示例数
  • n =功能数量+ 1

在此处输入图片说明

这里

  • m = 5(训练示例)
  • n = 4(功能+1)
  • X = mxn矩阵
  • y = mx 1向量矩阵
  • θ= nx 1矢量矩阵
  • x i是第i 训练示例
  • x j是给定训练示例中的 j 特征

进一步,

  • h(x) = ([X] * [θ]) (我们的训练集的mx 1个预测值矩阵)
  • h(x)-y = ([X] * [θ] - [y]) (mx 1我们的预测误差矩阵)

机器学习的总体目标是最大程度地减少预测错误。根据上述推论,我们的错误矩阵为mx 1矢量矩阵,如下所示:

在此处输入图片说明

为了计算θj的新的价值,我们必须得到用j乘以训练集X.特征值的所有错误(m行)的总和 ,把所有的值E,单独乘他们 j 特征相应的训练示例,然后将它们全部加在一起。这将帮助我们在得到θj的新的(希望更好)值。对所有j个或要素数量重复此过程。以矩阵形式,可以写成:

在此处输入图片说明

可以简化为: 在此处输入图片说明

  • [E]' x [X]将给我们一个行向量矩阵,因为E'是1 xm矩阵,X是mxn矩阵。但是我们对获取列矩阵感兴趣,因此我们对结果矩阵进行转置。

更简洁地说,它可以写为: 在此处输入图片说明

由于(A * B)' = (B' * A') ,并且A'' = A ,我们也可以将上面的写为

在此处输入图片说明

这是我们开始时的原始表达:

theta = theta - (alpha/m) * (X' * (X * theta - y))
收藏
评论

尽管不像矢量化版本那样可扩展,但是基于梯度下降的基于循环的计算应产生相同的结果。在上面的示例中,梯度下降无法计算正确的theta的最可能情况是alpha的值。

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题