为什么此代码中的“theta”是NaN?

时间:2017-01-24 15:06:29

标签: matlab neural-network linear-regression gradient-descent

我在MATLAB中为我的研究项目学习神经网络(线性回归),这是我使用的代码的一部分。 问题是“theta”的价值是NaN,我不知道为什么。 你能告诉我错误在哪里吗?

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
theta = zeros(2, 1); % initialize fitting parameters
%GRADIENTDESCENT Performs gradient descent to learn theta
% theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by 
% taking num_iters gradient steps with learning rate alpha
% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
    theta = theta - ((alpha/m)*((X*theta)-y)' * X)';
end
end
% run gradient descent
theta = gradientDescent(X, y, theta, alpha, iterations); 

1 个答案:

答案 0 :(得分:0)

你的功能很好。但Xtheta的大小不相容。通常,如果size(X)[N, M],则size(theta)应为[M, 1]

所以我建议更换一行

theta = zeros(2, 1); 

theta = zeros(size(X, 2), 1);

应该包含与theta一样多的列。因此,在此示例中,size(X)应为[133, 2]

此外,您应该在调用函数之前移动该初始化。

例如,如果您从函数中删除NaN的初始化,则以下代码不会返回theta

X = rand(133, 1); % or rand(133, 2)
y = rand(133, 1);
theta = zeros(size(X, 2), 1); % initialize fitting parameters

% run gradient descent
theta = gradientDescent(X, y, theta, 0.1, 1500) 

编辑:这是对以下评论的回应。

您的问题是由于梯度下降算法未收敛。要自己查看,请绘制J_history,如果算法稳定,则应该永远不会增加。您可以通过在函数J_history中的for循环中插入以下行来计算gradientDescent

J_history(iter) = mean((X * theta - y).^2);

在您的情况下(即,给定数据文件和alpha = 0.01),J_history呈指数级增长。这显示在下面的图中。注意,y轴是对数刻度。 Unstable

这是梯度下降不稳定的明显迹象。

有两种方法可以消除这个问题。

选项1.使用较小的alpha alpha控制梯度下降的速度。如果它太大,算法就不稳定了。如果它太小,算法需要很长时间才能达到最佳解决方案。尝试类似alpha = 1e-8的内容,然后从那里开始。例如,alpha = 1e-8会产生以下成本函数:

smaller alpha

选项2.使用特征缩放来减小输入的幅度。一种方法是Standarization。以下是使用标准化和生成的成本函数的示例:

data=xlsread('v & t.xlsx');
data(:,1) = (data(:,1)-mean(data(:,1)))/std(data(:,1));

standarization