我在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);
答案 0 :(得分:0)
你的功能很好。但X
和theta
的大小不相容。通常,如果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轴是对数刻度。
这是梯度下降不稳定的明显迹象。
有两种方法可以消除这个问题。
选项1.使用较小的alpha
。 alpha
控制梯度下降的速度。如果它太大,算法就不稳定了。如果它太小,算法需要很长时间才能达到最佳解决方案。尝试类似alpha = 1e-8
的内容,然后从那里开始。例如,alpha = 1e-8
会产生以下成本函数:
选项2.使用特征缩放来减小输入的幅度。一种方法是Standarization。以下是使用标准化和生成的成本函数的示例:
data=xlsread('v & t.xlsx');
data(:,1) = (data(:,1)-mean(data(:,1)))/std(data(:,1));