27

画像の品質が良いかどうかを判断するための仮説を得るために、コスト関数を最小化する勾配降下アルゴリズムを実装しました。私は Octave でそれを行いました。このアイデアは、Andrew Ng による機械学習クラスのアルゴリズムに何らかの形で基づいています。

したがって、0.5 から ~12 までの値を含む 880 の値 "y" があります。また、「X」には 50 から 300 までの 880 の値があり、画像の品質を予測する必要があります。

悲しいことに、アルゴリズムは失敗したようです。いくつかの反復の後、theta の値が非常に小さいため、theta0 と theta1 が「NaN」になります。そして、私の線形回帰曲線は奇妙な値を持っています...

勾配降下アルゴリズムのコードは次のとおりです: ( theta = zeros(2, 1);, alpha= 0.01, iterations=1500)

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters


    tmp_j1=0;
for i=1:m, 
    tmp_j1 = tmp_j1+ ((theta (1,1) + theta (2,1)*X(i,2)) - y(i));
end

    tmp_j2=0;
for i=1:m, 
    tmp_j2 = tmp_j2+ (((theta (1,1) + theta (2,1)*X(i,2)) - y(i)) *X(i,2)); 
end

    tmp1= theta(1,1) - (alpha *  ((1/m) * tmp_j1))  
    tmp2= theta(2,1) - (alpha *  ((1/m) * tmp_j2))  

    theta(1,1)=tmp1
    theta(2,1)=tmp2

    % ============================================================

    % Save the cost J in every iteration    
    J_history(iter) = computeCost(X, y, theta);
end
end

そして、コスト関数の計算は次のとおりです。

function J = computeCost(X, y, theta)   %

m = length(y); % number of training examples
J = 0;
tmp=0;
for i=1:m, 
    tmp = tmp+ (theta (1,1) + theta (2,1)*X(i,2) - y(i))^2; %differenzberechnung
end
J= (1/(2*m)) * tmp
end
4

9 に答える 9

25

あなたのcomputeCost機能は間違っていると思います。私は昨年NGのクラスに参加し、次の実装(ベクトル化)を持っています:

m = length(y);
J = 0;
predictions = X * theta;
sqrErrors = (predictions-y).^2;

J = 1/(2*m) * sum(sqrErrors);

実装の残りの部分は、ベクトル化することもできますが、私には問題ないようです。

theta_1 = theta(1) - alpha * (1/m) * sum((X*theta-y).*X(:,1));
theta_2 = theta(2) - alpha * (1/m) * sum((X*theta-y).*X(:,2));

その後、一時シータ (ここでは theta_1 および theta_2 と呼ばれます) を「実際の」シータに正しく設定します。

一般に、ループの代わりにベクトル化する方が便利で、読み取りやデバッグが煩わしくありません。

于 2012-05-07T17:32:58.677 に答える
2

ベクトル化されたバージョンのようにスケーラブルではありませんが、勾配降下のループベースの計算は同じ結果を生成するはずです。上記の例で、勾配降下法が正しいシータを計算できない可能性が最も高いのは、アルファの値です。

検証済みのコスト関数と勾配降下関数のセット、および質問で説明されているものと同様のデータのセットを使用すると、数回反復した直後に theta が NaN 値になりますalpha = 0.01。ただし、 に設定するalpha = 0.000001と、勾配降下は 100 回の反復後でも期待どおりに機能します。

于 2015-03-02T07:29:58.150 に答える
2

最小二乗コスト関数を使用しても問題ない場合は、勾配降下の代わりに正規方程式を使用してみてください。これははるかに単純で (1 行だけ)、計算も高速です。

これが正規方程式です: http://mathworld.wolfram.com/NormalEquation.html

そしてオクターブ形式で:

theta = (pinv(X' * X )) * X' * y

正規方程式の使用方法を説明するチュートリアルを次に示します: http://www.lauradhamilton.com/tutorial-linear-regression-with-octave

于 2013-07-29T14:53:54.383 に答える