【问题标题】:Why "theta" in this code is NaN? [duplicate]为什么这段代码中的“theta”是 NaN? [复制]
【发布时间】:2017-06-09 10:47:01
【问题描述】:

我正在 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); 

【问题讨论】:

  • 你能提供你给函数的输入参数的值吗?
  • @Cebri alpha = 0.01 和 num_iters = 1500 并且 (X, y) 都是 133×1 的列向量
  • 鉴于这些输入值,for 循环中的行不应该工作。当您尝试在 X (size(X) = 133x1) 和 theta (size(theta) = 2x1) 之间执行矩阵乘法时,您应该会收到 Inner matrix dimensions must agree 错误。另外,为什么你传入theta 的值只是为了将它定义为一个零矩阵?
  • @VladislavMartin 我尝试使用 X 和 y 的转置,它没有给我任何错误,但“theta”仍然具有 NaN 值。你能提出一个解决方案吗? Theta 是成本函数中的参数(权重),其初始值为零。每次迭代都会对其进行调整以最小化错误。这不是我的代码,我是从在线课程中获得的,我正在尝试根据我的应用程序对其进行修改。
  • 好的,那么转置是什么?

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


【解决方案1】:

你的功能很好。但是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) 

编辑:这是对下面的 cmets 的回应。

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

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

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

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

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

选项 1。使用较小的 alphaalpha 控制梯度下降的速率。如果太大,算法不稳定。如果太小,算法需要很长时间才能达到最优解。试试alpha = 1e-8 之类的东西,然后从那里开始。例如,alpha = 1e-8 会产生以下成本函数:

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

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

【讨论】:

  • 我试过你的代码,但它没有返回 NaN ,只有当我在 "theta" 之前添加这一行时:X = [ones(m,1), rand(133,1)]; % Add a column of ones to x 但是当我用 Excel 表中的值替换 X 和 y 时它会不起作用,“theta”返回NaNX = data(:,6); y = data(:,1); X = [ones(m,1), data(:,6)]; theta = zeros(size(X, 2), 1); theta = gradientDescent(X, y, theta, 0.01, 1500); 你能告诉我错误在哪里吗?
  • 您确定从函数gradientDescent 中删除了theta = zeros(2, 1); 行吗?还要确保Xy 只包含有效的有限数。作为测试,var(X)var(y) 返回什么?如果您需要进一步的帮助,可以将数据文件上传到 Google 云端硬盘并公开分享以供我们检查。
  • 是的,我用你的替换了这一行:theta = zeros(size(x, 2), 1); var(x) = 0 312.1246var(y) = 3.7478e+05 我使用的是 theta = zeros(2, 1); 行,因为我使用的是 x = [ones(m, 1), data(:, 2)]; % To add a column of ones to x 这行这是我的数据文件,第一列是速度(km/s),第二列是时间(小时):drive.google.com/file/d/0Bw5Fgx5h69chMlMzVlNpbEd6YzA/…我真的很感谢你的帮助。
  • 我尝试更改alphaiterations 的值,发现theta 停止返回NaN,但我得到了错误的线性回归。
  • 问题是由于梯度下降算法因您选择的数据和alpha而发散。在上面的答案中查看更详细的回复。
猜你喜欢
  • 2012-11-04
  • 2014-01-10
  • 2018-07-07
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 2017-11-21
相关资源
最近更新 更多