梯度下降似乎失败了

Tyz*_*zak 26 machine-learning octave gradient-descent

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

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

遗憾的是,算法似乎失败了,经过一些迭代后,theta的值非常小,theta0和theta1变为"NaN".而我的线性回归曲线有奇怪的价值......

这是梯度下降算法的代码:(theta = zeros(2, 1);,alpha = 0.01,iterations = 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
Run Code Online (Sandbox Code Playgroud)

这是成本函数的计算:

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
Run Code Online (Sandbox Code Playgroud)

jer*_*use 33

如果您想知道看似复杂的外观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错误矩阵)

机器学习的整个目标是最小化预测中的错误.基于上述推论,我们的误差矩阵是m x 1矢量矩阵如下:

在此输入图像描述

为了计算θ的新的价值Ĵ,我们必须得到乘用j所有错误(m行)的总和的训练集X的特征值也就是说,把所有的值E,分别为J乘他们功能的的相应训练例子,并添加它们放在一起.这将帮助我们在得到θ的新的(希望更好)值Ĵ.对所有j或特征数重复此过程.在矩阵形式中,这可以写成:

在此输入图像描述

这可以简化为: 在此输入图像描述

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

更简洁,它可以写成: 在此输入图像描述

既然(A * B)' = (B' * A'),和A'' = A,我们也可以写上面的

在此输入图像描述

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

theta = theta - (alpha/m) * (X' * (X * theta - y))
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助 - 矩阵数学的冗长对我来说完全不同。 (2认同)

Mar*_*kus 31

我把theta的东西矢量化了......可能会帮助别人

theta = theta - (alpha/m *  (X * theta-y)' * X)';
Run Code Online (Sandbox Code Playgroud)

  • 这个是正确的答案.写这个的另一种方法:`theta = theta - alpha/m*(X'*(X*theta - y));`在可能的情况下最好使用vectoriaztion. (7认同)

Tho*_*lut 25

我认为你的computeCost功能是错误的.我去年参加了NG班,我有以下实施(矢量化):

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

J = 1/(2*m) * sum(sqrErrors);
Run Code Online (Sandbox Code Playgroud)

其余的实现对我来说似乎很好,尽管你也可以对它们进行矢量化.

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));
Run Code Online (Sandbox Code Playgroud)

之后,您将临时thetas(此处称为theta_1和theta_2)正确设置回"real"theta.

通常,矢量化而不是循环更有用,读取和调试不那么烦人.