我目前正在 coursera 上学习 Andrew Ng 机器学习课程,在第 2 周他讨论了特征缩放。
我看过讲座并阅读了很多帖子;我理解特征缩放背后的原因(基本上是通过以大致相同的比例表示所有特征来使梯度下降更快收敛)。
当我尝试这样做时,我的问题就出现了。我正在使用 Octave,并且我设置了带有线性回归的梯度下降代码:它计算假设的“theta”矩阵,对于非缩放值来说很好,给出准确的预测。
当我使用输入矩阵 X 和输出向量 Y 的缩放值时,计算的 theta 值和成本函数 J(theta) 与未缩放值不同。这是正常的吗?如何“撤消”缩放比例,以便当我用真实数据测试我的假设时,我得到准确的结果?
作为参考,这是我正在使用的缩放函数(在 Octave 中):
function [scaledX, avgX, stdX] = feature_scale(X)
is_first_column_ones=0; %a flag indicating if the first column is ones
sum(X==1)
if sum(X==1)(1) == size(X)(1) %if the first column is ones
is_first_column_ones=1;
X=X(:,2:size(X)(2)); %strip away the first column;
end
stdX=std(X);
avgX=mean(X);
scaledX=(X-avgX)./stdX;
if is_first_column_ones
%add back the first column of ones; they require no scaling.
scaledX=[ones(size(X)(1),1),scaledX];
end
end
我是缩放我的测试输入,缩放我的 theta,还是两者兼而有之?
我还应该注意,我是这样缩放的:
scaledX=feature_scale(X);
scaledY=feature_scale(Y);
其中 X 和 Y 分别是我的输入和输出。X 的每一列代表一个不同的特征(对于偏置特征 theta0,第一列始终为 1),X 的每一行代表一个不同的输入示例。Y 是一维列矩阵,其中每一行是一个输出示例,对应于 X 的输入。
例如:X = [1, x, x^2]
1.00000 18.78152 352.74566
1.00000 0.61030 0.37246
1.00000 21.41895 458.77124
1.00000 3.83865 14.73521
Y =
99.8043
1.8283
168.9060
-29.0058
^ 这是函数 y=x^2 - 14x + 10
