2017-08-16 9 views
0

ロジスティック回帰を実装する際に、私は段階的にどのように進めるべきかという面でいくつかの困難を抱えています。私がこれまで行ったことによると、私は次のようにそれを実装しています:ロジスティック回帰の実装

  • まず機能の数に等しいthetaを取り、そのゼロのn*1ベクトル作ります。今すぐ勾配
    grad = (1/m) * sum ((sigmoid(X*theta) - y')*X);を計算最後に
    J= 1/m *((sum(-y*log(htheta))) - (sum((1-y) * log(1 - htheta)))) + lambda/(2*m) * sum(theta).^2

  • コスト関数を計算するための最初のステップで計算thetaを用いて、以下の htheta = sigmoid(theta' * X');
    theta = theta - (alpha/m) * sum (htheta' - y)'*X

  • を計算するために、このthetaを使用

私はthetaをゼロにしています。私はベクトル全体でJの同じ値を得ています、これは正しい出力ですか?

+0

ダミーデータなどを使用して、最小の実例を提供できますか。 'y = randi(2、[10,1]) - 1'&' X = [ones(10,1)randn([10,1]) 'のように生成することができます。私が見ることができるところから、「シータ」を更新するとコスト関数が変わるはずです。しかし、グラジエントを2回計算する理由(すなわち、 'theta'の更新時と最終ステップで1回)が不明瞭です。 – zundertj

+0

@zundertj実際には私も不明な部分です。あなたが最初に何を計算するのか、なぜそれができるのかを教えてもらえれば、それができます。 –

答えて

0

新しいthetaの計算で以前に計算されていたが、最後のステップでグラジェントを計算しています。さらに、コスト関数の定義には正則化パラメータが含まれていますが、これは勾配計算に組み込まれていません。正則のない作業バージョン:

% generate dummy data for testing 
y=randi(2,[10,1])-1; 
X=[ones(10,1) randn([10,1])]; 

% initialize 
alpha = 0.1; 
theta = zeros(1,size(X,2)); 
J = NaN(100,1); 

% loop a fixed number of times => can improve this by stopping when the 
% cost function no longer decreases 
htheta = sigmoid(X*theta'); 
for n=1:100 
    grad = X' * (htheta-y); % gradient 
    theta = theta - alpha*grad'; % update theta 
    htheta = sigmoid(X*theta'); 
    J(n) = sum(-y'*log(htheta)) - sum((1-y)' * log(1 - htheta)); % cost function 
end 

あなたは今、コスト関数をプロットした場合、あなたはそれが約15回の反復後に収束すること(ランダム性を除く)が表示されます。

関連する問題