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ループを追加する必要があります。したがって、シータの値をいくつでも許可しますが、どのように/どこで頭を包むことができるかは気にしません。
この関数内でシータの値をいくつでも許可できる方法を誰かが提案できますか?
私が尋ねようとしていることを理解するためにより多くの情報が必要な場合、私はそれを提供するために最善を尽くします。
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);
上記の答えは完璧ですが、あなたもすることができます
H = (X*theta);
S = sum((H - y) .^ 2);
J = S / (2*m);
コンピューティングではなく
(theta' * X')'
そして転置を取ると、直接計算できます
(X * theta)
完璧に機能します。
ラインで行うこともできます-m-#トレーニングセット
J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
J = sum(((X*theta)-y).^2)/(2*m);
ans = 32.073
上記の答えは完璧です、私は1日問題を深く考えていましたが、まだオクターブに慣れていないので、一緒に勉強してください!
マトリックスのみを使用する場合:
temp = (X * theta - y); % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;
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