Octave
機械学習
MachineLearning
coursera

logistic regression(ロジスティック回帰) octaveによるコスト関数の計算方法

※アウトプット用のメモです。あしからず。
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;

こっちはもっと楽な書き方があればーーと思うところ。