多个变量的梯度下降失败,导致NaN

时间:2018-08-17 22:22:38

标签: machine-learning octave linear-regression gradient-descent

我正在尝试实现梯度下降算法,以使多重线性算法的成本函数最小化。我正在使用Andrew Ng在机器学习课程中解释的概念。我正在使用Octave。但是,当我尝试执行代码时,似乎无法提供解决方案,因为我的theta值计算为“ NaN”。我已经附上了成本函数代码和梯度下降代码。有人可以帮忙吗。

费用函数:

function J = computeCostMulti(X, y, theta)

m = length(y); % number of training examples

J = 0;

h=(X*theta);
s= sum((h-y).^2);
J= s/(2*m);

梯度下降代码:

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

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

for iter = 1:num_iters

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

  J_history(iter) = computeCostMulti(X, y, theta);  
end

2 个答案:

答案 0 :(得分:2)

我在GNU Octave中实现了该算法,并将其分为2个不同的函数,首先需要定义一个梯度函数

function [thetaNew] = compute_gradient (X, y, theta, m)
    thetaNew = (X'*(X*theta'-y))*1/m;
end

然后使用其他函数来计算梯度下降算法

function [theta] = gd (X, y, alpha, num_iters)
    theta = zeros(1,columns(X));
    for iter = 1:num_iters,
        theta = theta - alpha*compute_gradient(X,y,theta,rows(y))';                
    end
end

编辑1 该算法适用于多元线性回归(多元自变量)和1个独立变量的线性回归,我对此数据集进行了测试

age height  weight
41  62  115
21  62  140
31  62  125
21  64  125
31  64  145
41  64  135
41  72  165
31  72  190
21  72  175
31  66  150
31  66  155
21  64  140

在此示例中,我们要预测

predicted weight = theta0 + theta1*age + theta2*height

我将这些输入值用于alpha和num_iters

alpha=0.00037
num_iters=3000000

该实验的运行梯度下降的输出如下:

theta =
-170.10392    -0.40601     4.99799

所以等式是

predicted weight = -170.10392 - .406*age + 4.997*height

这几乎是梯度的绝对最小值,因为对于 如果使用PSPP(SPSS的开源替代方案),则会出现此问题

predicted weight = -175.17 - .40*age + 5.07*height

希望这有助于确认梯度下降算法在多元线性回归和标准线性回归中的作用相同

答案 1 :(得分:1)

我确实发现了该错误,但它既不是成本函数的逻辑也不是梯度下降函数的逻辑。但是确实在功能规范化逻辑中,我不小心返回了错误的变量,因此警告输出为“ NaN”

这是愚蠢的错误:

我以前在做什么

mu= mean(a);
sigma = std(a);
b=(X.-mu);
X= b./sigma;

相反,我应该做什么

function [X_norm, mu, sigma] = featureNormalize(X)
%FEATURENORMALIZE Normalizes the features in X 
%   FEATURENORMALIZE(X) returns a normalized version of X where
%   the mean value of each feature is 0 and the standard deviation
%   is 1. This is often a good preprocessing step to do when
%   working with learning algorithms.

% You need to set these values correctly
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));

% ====================== YOUR CODE HERE ======================


mu= mean(X);
sigma = std(X);
a=(X.-mu);
X_norm= a./sigma;

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

end

所以很明显,我应该使用X的X_norm,这是警告代码提供错误输出的原因