3

単純な線形単一変数勾配降下法から、より高度なもの、つまり一連の点に最適な多項式フィットに移行しようとしています。私は簡単なオクターブ テスト スクリプトを作成しました。これにより、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 が正しく最小化されているように見えても、常に間違った結果が得られます。私はプロッティング関数を正規方程式でチェックしました (これはもちろん正しく機能します。エラーはシータ方程式のどこかにあると思いますが、それが何であるかを理解することはできません.

4

1 に答える 1

3

私はあなたのコードを実装しましたが、それはうまくいくようです。あなたが望む結果が得られない理由は、目的関数を最小化しようとすると、線形回帰または多項式回帰が局所的最小値に悩まされるためです。アルゴリズムは、実行中に局所最小値にトラップされます。ステップ(アルファ)を​​変更するコードを実装すると、ステップが小さいほどデータにうまく適合することがわかりましたが、それでも局所最小値にトラップされています。

異なる極小値にトラップするたびに、シータのランダムな初期化ポイントを選択します。運が良ければ、シータのより良い初期点を見つけて、データをより適切に適合させることができます。最適な初期点を見つけるアルゴリズムがいくつかあると思います。

以下に、ランダムな初期点の結果と、Matlab の polyfit の結果を添付します。

ここに画像の説明を入力

  • 上記のプロットで、「線形回帰を多項式回帰」に置き換え、「エラー」と入力します。

プロットをよく観察すると、たまたま ( rand() を使用して) いくつかの初期点を選択したことがわかります。これにより、他の初期点と比較して最適なデータ フィッティングが得られました....私はそれをポインターで示しています。

于 2015-01-08T10:38:43.293 に答える