web-dev-qa-db-ja.com

ハードコーディングシータを回避しようとするコスト関数、線形回帰。オクターブ。

Andrew Ng教授のCourseraによる機械学習コースの2週目です。私たちは線形回帰に取り組んでおり、現在はコスト関数のコーディングを扱っています。

私が書いたコードは問題を正しく解決しますが、提出プロセスに合格せず、シータの値をハードコーディングしており、シータの3つ以上の値を許可していないため、単体テストに失敗します。

ここに私が今までに持っているコードがあります

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を生成するはずです

したがって、シータを反復処理するために別のforループを追加する必要があります。したがって、シータの値をいくつでも許可しますが、どのように/どこで頭を包むことができるかは気にしません。

この関数内でシータの値をいくつでも許可できる方法を誰かが提案できますか?

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

46
Faulty

Octave/Matlabで操作のベクトル化を使用できます。ベクトル全体を反復処理する-プログラム言語で操作をベクトル化できる場合、それは本当に悪い考えです。 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);
71
Simplex

上記の答えは完璧ですが、あなたもすることができます

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

コンピューティングではなく

(theta' * X')'

そして転置を取ると、直接計算できます

(X * theta)

完璧に機能します。

29
caped114

以下の行は、ゼロに初期化されたθを使用してcomputeCostを1回実行している間に、必要な32.07のコスト値を返します。

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

以下に示す元の式に似ています。

enter image description here

10
user3352632

ラインで行うこともできます-m-#トレーニングセット

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
2
prajnan2k
J = sum(((X*theta)-y).^2)/(2*m);
ans =  32.073

上記の答えは完璧です、私は1日問題を深く考えていましたが、まだオクターブに慣れていないので、一緒に勉強してください!

0
Jessica

マトリックスのみを使用する場合:

temp = (X * theta - y);        % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;
0
function J = computeCost(X, y, theta)

m = length(y);

J = 0;

% Hypothesis h(x)
h = X * theta;

% Error function (h(x) - y) ^ 2
squaredError = (h-y).^2;

% Cost function
J = sum(squaredError)/(2*m);

end
0
Shakir