LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

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

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1