我试图从简单的线性单变量梯度下降转向更高级的东西:一组点的最佳多项式拟合。我创建了一个简单的 octave 测试脚本,它允许我在 2D 空间中直观地设置点,然后启动梯度下降算法并查看它如何逐渐接近最佳拟合。
不幸的是,它的效果不如简单的单变量线性回归:我得到的结果(当我得到它们时)与我期望的多项式不一致!
这是代码:
dim=5;
h = figure();
axis([-dim dim -dim dim]);
hold on
index = 1;
data = zeros(1,2);
while(1)
[x,y,b] = ginput(1);
if( length(b) == 0 )
break;
endif
plot(x, y, "b+");
data(index, :) = [x y];
index++;
endwhile
y = data(:, 2);
m = length(y);
X = data(:, 1);
X = [ones(m, 1), data(:,1), data(:,1).^2, data(:,1).^3 ];
theta = zeros(4, 1);
iterations = 100;
alpha = 0.001;
J = zeros(1,iterations);
for iter = 1:iterations
theta -= ( (1/m) * ((X * theta) - y)' * X)' * alpha;
plot(-dim:0.01:dim, theta(1) + (-dim:0.01:dim).*theta(2) + (-dim:0.01:dim).^2.*theta(3) + (-dim:0.01:dim).^3.*theta(4), "g-");
J(iter) = sum( (1/m) * ((X * theta) - y)' * X);
end
plot(-dim:0.01:dim, theta(1) + (-dim:0.01:dim).*theta(2) + (-dim:0.01:dim).^2.*theta(3) + (-dim:0.01:dim).^3.*theta(4), "r-");
figure()
plot(1:iter, J);
我不断得到错误的结果,即使看起来 J 被正确地最小化了。我用正规方程检查了绘图函数(它当然可以正常工作,虽然我相信错误出在 theta 方程的某个地方,但我无法弄清楚它是什么。