※アウトプット用のメモです。あしからず。
octaveみたいに行列でガツガツ計算していくとき、しっかり次元を意識しないと、闇雲にエラーと戦うハメになる。そこだけ気をつければ、あとは公式通り。
1, logistic regression
% m:データセットの個数
% J:コスト関数
% grad: Gradient
for i = 1:m,
z = theta' * X(i,:)';
J += (- y(i) * log(sigmoid(z)) - (1 - y(i)) * log(1 - sigmoid(z)))/m;
grad += (((sigmoid(z) - y(i)) * X(i,:))')/m;
end;
レギュライズド(日本語でなんていうんだろ)してないからλの処理をしなくていいし、やってることはLinear Regression(線形回帰)のときと一緒。
2, Regularized logistic regression
パッと思いついたやつ(一部抜粋)
%gradientの計算から
%j=0の項は一旦無視して、gradientを計算。余計に足したlambdaの処理はあとで修正
%注意するべきは、λの項は後で足さないといけないところ
%for loopの中に入れると、λ項がm回足されてgradientがでかくなる
for j = 1:m,
z = theta' * X(j,:)';
grad += ((sigmoid(z) - y(j)) * X(j,:)') / m ;
end;
%行列計算のため計算がちぐはぐ。いい方法はないだろうか。
grad += lambda .* theta / m;
grad(1) -= lambda .* theta(1) / m;
%コスト関数の計算
%こちらも気をつけるべきところはλ項を足すのはj>=1のときということ
%それからλの項(regularized)の項は別にして計算すること(rangeが1~size(theta))なので)
for i = 1:m,
z = theta' * X(i,:)';
J += (- y(i) * log(sigmoid(z)) - (1 - y(i)) * log(1 - sigmoid(z)))./m;
end;
regularized = 0;
for j = 2:size(theta),
regularized += (theta(j))^2 .* lambda ./ (2.*m);
end;
J += regularized;
end;
こっちはもっと楽な書き方があればーーと思うところ。