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