3

我试图从简单的线性单变量梯度下降转向更高级的东西:一组点的最佳多项式拟合。我创建了一个简单的 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 方程的某个地方,但我无法弄清楚它是什么。

4

1 回答 1

3

我实现了你的代码,它似乎很好,你没有得到你想要的结果的原因是当你试图最小化目标函数时,你的线性回归或多项式回归会受到局部最小值的影响。该算法在执行期间陷入局部最小值。我实现了更改步长(alpha)的代码,我发现步长更小,它更适合数据,但你仍然陷入局部最小值。

每次我陷入不同的局部最小值时,都会选择 thetas 的随机初始化点。如果幸运的话,您会为 theta 找到更好的初始点并更好地拟合数据。我认为有一些算法可以找到最佳初始点。

下面我附上随机初始点的结果和 Matlab 的 polyfit 的结果。

在此处输入图像描述

  • 在上面的图中,用多项式回归替换“线性回归”,输入错误。

如果您更好地观察该图,您会偶然发现(使用 rand() )我选择了一些初始点,这些初始点使我得到了比较其他初始点的最佳数据拟合……我用指针显示了这一点。

于 2015-01-08T10:38:43.293 回答