2016-03-11 11 views
5

私はMachine Learningに関するAndrew Ngの講義をしています。私は、複数の変数のベクトル化された実装コース。"sum"を使用してOctaveで複数の変数のグラデーションディセントを実装する

これは(hereから取られた)問題のアルゴリズムです:

enter image description here

私はちょうどかかわらず、sumを使ってオクターブでこれを行うことができない、私はの仮説の合計を乗算するかどうかはわかりませんx(i)-y(i)をすべての変数xj(i)で除算する。線形代数の初心者へ(

theta = theta - alpha/m * sum(X * theta - y) * X; 

正しい答えは、しかし、完全に非自明である:私は、次のコードの異なる繰り返しを試みたが、無駄(寸法は右ではないか、答えが間違っているのいずれか)に)hereから、とにかく私のように:

theta = theta - (alpha/m * (X * theta-y)' * X)'; 

は、上記のような変換を支配するsumが関与する場合の目安はありますか?

もしそうなら、単一の変数の勾配降下のためにsumを使用して正しい実装を思い付くことができたので、上記の反対のバージョンがあります(すなわち、sumベースのソリューションから一般的な乗算になります)。 (1つの非常にエレガントではないが):

temp0 = theta(1) - (alpha/m * sum(X * theta - y)); 
temp1 = theta(2) - (alpha/m * sum((X * theta - y)' * X(:, 2))); 

theta(1) = temp0; 
theta(2) = temp1; 

これだけ関心が実装をベクトル化し、SOこれがどのように行われるかにように、私の質問は主にアルゴリズムの実装と懸念している上のいくつかの質問がありますがあることに注意してくださいオクターブでsumを使用してください。

+2

可能な複製(http://stackoverflow.com/questions/32274474/machine-learning-linear-regression- – rayryeng

+1

重複したリンク、特に 'sum'を使った2番目のアプローチを見てください。 – rayryeng

答えて

4

次のように一般的な「親指のルールは、」あなたは

SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...) 

の形で何かが発生した場合、あなたは簡単にそれをベクトル化することができます(これは上記で行われているものである)、である

てこのよう
f(x, y, ...)' * g(a, b, ...) 

は(有限次元のユークリッド空間での)数学で

<A, B> = SUM_i A_i B_i = A'B 
のように見えるだけで、典型的な内積であり、あなたは、これは、ドット積の単なる数学的な定義であるとして、これは、両方の方法を動作します見ることができるよう

ので

(X * theta-y)' * X) 

はちょうど

<X * theta-y), X> = <H_theta(X) - y, X> = SUM_i (H_theta(X_i) - y_i) X_i 

です。

1

質問のこの部分を参照してください - "私はすべての変数xj(i)でx(i) - y(i)の仮説の和をどのように乗算するのか分かりません。

Octaveでは、xj(i)をすべての予測に掛けることができます。」、それは次のように記述できるように:

m = size(X, 1); 
predictions = X * theta; 
sqrErrors = (predictions-y).^2; 
J = 1/(2*m) * sum(sqrErrors); 
[機械学習 - バッチ勾配降下を使用して線形回帰]の
関連する問題