我正在尝试实现梯度下降算法,以使多重线性算法的成本函数最小化。我正在使用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
答案 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,这是警告代码提供错误输出的原因