2

私は現在、Courseraプラットフォームで機械学習を行っています。ロジスティック回帰を実装しようとしています。ロジスティック回帰を実装するために、私は、コスト関数を最小化するために勾配降下を使用していると私は、コストやパラメータの現在のセットで評価された各パラメータの勾配の両方を返しcostFunctionReg.mという関数を書くことです。Matlab正規化されたロジスティック回帰 - グラジエントの計算方法

Problem Description

Problem Description Continued

マイコスト関数が働いているが、勾配関数ではありません。

問題は、より良い、以下に説明されます。は、私はむしろ、要素ごとの操作よりも、この使用してループを実装することを好むことに注意してください。

私はつまり、我々は(lambda付き)最初の用語を使用しないでください、それは正則されていない別途として(MATLAB、theta(1)で)theta[0]を計算しています。

function [J, grad] = costFunctionReg(theta, X, y, lambda) 
    %COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization 
    % J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using 
    % theta as the parameter for regularized logistic regression and the 
    % gradient of the cost w.r.t. to the parameters. 

    % Initialize some useful values 
    m = length(y); % number of training examples 
    n = length(theta); %number of parameters (features) 

    % You need to return the following variables correctly 
    J = 0; 
    grad = zeros(size(theta)); 

    % ====================== YOUR CODE HERE ====================== 
    % Instructions: Compute the cost of a particular choice of theta. 
    %    You should set J to the cost. 
    %    Compute the partial derivatives and set grad to the partial 
    %    derivatives of the cost w.r.t. each parameter in theta 

    % ----------------------1. Compute the cost------------------- 
    %hypothesis 
    h = sigmoid(X * theta); 

    for i = 1 : m 
     % The cost for the ith term before regularization 
     J = J - (y(i) * log(h(i))) - ((1 - y(i)) * log(1 - h(i))); 

     % Adding regularization term 
     for j = 2 : n 
      J = J + (lambda/(2*m)) * (theta(j))^2; 
     end    
    end 
    J = J/m; 

    % ----------------------2. Compute the gradients------------------- 

    %not regularizing theta[0] i.e. theta(1) in matlab 

    j = 1; 

    for i = 1 : m 
     grad(j) = grad(j) + (h(i) - y(i)) * X(i,j); 
    end 

    for j = 2 : n  
     for i = 1 : m 
      grad(j) = grad(j) + (h(i) - y(i)) * X(i,j) + lambda * theta(j); 
     end  
    end 

    grad = (1/m) * grad; 

    % ============================================================= 
end 

私は間違っていますか?

+0

Plsのヘルプ編集コードブロックの書式...新しいユーザーと – Malixa

+2

コーセラ機械学習運動を:(する方法がわかりませんえっ?セイハイアンドリュー・ウへ。 –

+0

今。私は長い時間前にコースを取った。しかし、私はあなたが正則にする必要はありませんオフセット項を表し、Xの左に '0'の列を追加することがあると思いますオフセット項ではなく非正規化項を最初のフィーチャ(最初の列)に適用しています。 'X = [ゼロ(サイズ(X、1)、1)X]' –

答えて

1

正規化を適用する方法が正しくありません。の後に正規化を追加すると、すべてのトレーニングの例を合計しますが、各例の後に正規化を追加します。訂正前のコードをそのまま残してしまった場合、偶然、勾配のステップを大きくしてしまい、最終的に解決策をオーバーシュートすることになります。このオーバーシュートは、蓄積されますと、必然的にあなたに(バイアス項を除く)のすべてのコンポーネントのInfまたは-Infの勾配ベクトルを与えます。二forループが終了した後

簡単に言えば、あなたのlambda*theta(j)ステートメントを配置します。

for j = 2 : n  
    for i = 1 : m 
     grad(j) = grad(j) + (h(i) - y(i)) * X(i,j); % Change 
    end 
    grad(j) = grad(j) + lambda * theta(j); % Change 
end 
+1

ありがとうございました! – Malixa

+0

あなたは大歓迎です!私が一歩を踏み出すことができれば、要素的な賢明な方法を学ぶのに時間を費やすべきです。 MATLABはより高速で、ベクトル化と呼ばれる処理の一部です。がんばろう! – rayryeng

関連する問題