方程式をコードに変換するための一般的なヒューリスティックを開発しようとしています。この特定の質問は、合計関数を使用して方程式をMatlabに実装する方法を扱います。
sum()と行列乗算の使用例:
この方程式を実装し、sum()関数を使用する必要があると考えました。
J = 1/(2*m) * sum( (X*theta - y).^2 );
次に、sum()関数を使用せずに、この同様の方程式を実装しました。
theta = theta - (alpha/m) * ((X*theta - y)'*X)';
どこ:
X: 100x2 (training input plus a 'ones' vector)
y: 100x1 (training output)
theta: 2x1 (parameters)
m: 100 (length of y)
alpha: 0.01 (learning rate)
Matlabの行列乗算が合計を「処理」するときの原則は何ですか?
ありがとう!
線形代数のコンテキストでは、常に行列の乗算または行列やベクトルを扱うものを使用してください。具体的には、線形代数(行列での加算、減算、乗算などの組み合わせ)を使用して計算する必要があるものをすべて計算できる場合は、それを実行します。MATLABが作成された理由は、線形代数を使用して可能な限り高速に演算を実行するためでした。使用sum
は確かに遅くなります。たとえば、この投稿を見てください:Matlabでの高速行列乗算
この投稿は洞察も提供します:Matlab行列の乗算速度。MATLABもこのマルチスレッドを実行し、複数のコア向けに大幅に最適化されています。
テストが必要な場合は、sum
または行列乗算を使用してこの量を計算できることがわかる、より簡単なケース(式1)に取り組みましょう。次のJ
行列乗算を使用して計算することもできます。
d = X*theta - y;
J = 1/(2*m)*(d.'*d);
上記では、内積の定義を使用して、差の2乗の合計を計算します。これはX*theta - y
、m x 1
行列と見なされる行列乗算を使用して計算できます。上記で具体的に計算しているのは、最急降下法によって最小化される線形回帰のコスト関数です。theta
100 x 1になるようにかなり大きなパラメーターベクトルを作成し、10000000 x 100
100個のパラメーターで1,000万個のデータポイントがあるデータ行列を作成しましょう。マシンにRAMがたくさんあるので、このテストを実行できない可能性があります。また、これらすべてを乱数に初期化し、再現性を確保するためにシードを設定します。timeit
これらの両方にかかる時間を使用して見てみましょう。これは私が書いたテスト関数です:
function test_grad
rng(123);
theta = rand(100,1);
X = rand(1e7, 100);
y = rand(1e7, 1);
m = size(X, 1);
function test1
out = 1/(2*m) * sum( (X*theta - y).^2 );
end
function test2
d = X*theta - y;
out = 1/(2*m)*(d.'*d);
end
t1 = timeit(@test1);
t2 = timeit(@test2);
fprintf('The timing for sum: %f seconds\n', t1);
fprintf('The timing for matrix multiplication: %f seconds\n', t2);
end
この関数をMATLABで実行するsum
と、行列乗算の使用と使用の間で広範なテストが実行されます。
これは、この関数を実行したときに得られるものです。i7 Intel Core 2.3 GHzCPUを搭載したMacBookProに16GBのRAMがあります。
>> test_grad
The timing for sum: 0.594337 seconds
The timing for matrix multiplication: 0.393643 seconds
ご覧のとおり、行列の乗算(少なくとも私のマシンでは)は、を使用した実行ごとに平均で0.2秒の差がありtimeit
ます。
tl;dr
:行列乗算を使用できる場合は、それを実行してください。これは、コードを実行できる最速です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加