1. ホーム
  2. machine-learning

[解決済み] コスト関数、線形回帰、シータをハードコーディングしないようにする。オクターブ

2022-02-27 11:35:03

質問

CourseraのAndrew Ng教授の機械学習講座の2週目に入りました。私たちは線形回帰に取り組んでいて、今はコスト関数のコーディングに取り組んでいます。

私が書いたコードは問題を正しく解いていますが、提出プロセスを通過できず、ユニットテストも不合格です。なぜなら、私はthetaの値をハードコードし、thetaに2つ以上の値を許可しなかったからです。

以下は、私がこれまでに作成したコードです。

function J = computeCost(X, y, theta)

m = length(y);
J = 0;

for i = 1:m,
    h = theta(1) + theta(2) * X(i)
    a = h - y(i);
    b = a^2;
    J = J + b;
    end;
J = J * (1 / (2 * m));

end

ユニットテストは

computeCost( [1 2 3; 1 3 4; 1 4 5; 1 5 6], [7;6;5;4], [0.1;0.2;0.3])

で、ans = 7.0175 となるはずです。

そのため、もう1つのforループを追加して、thetaを繰り返し処理する必要があります。

どなたか、この関数内でthetaの値をいくつでも指定できる方法を教えてください。

私が尋ねようとしていることを理解するために、より多くの情報が必要であれば、私はそれを提供するために最善を尽くします。

どのように解決するのですか?

Octave/Matlabでは演算のvectorizeを使うことができます。 ベクトル全体を反復処理することは、プログラム言語が演算をベクトル化できる場合、本当に悪い考えです。 R, Octave, Matlab, Python (numpy)はこの操作を可能にします。 例えば、Theta = (t0, t1, t2, t3)とX = (x0, x1, x2, x3)のとき、次のようにしてスカラー生成を得ることができます。 theta * X' = (t0, t1, t2, t3) * (x0, x1, x2, x3)' = t0*x0 + t1*x1 + t2*x2 + t3*x3 結果はスカラーになります。

例えば、次のようにすれば、hをベクトル化することができます。

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);