Matlabで行列乗算、sum()、またはforループをいつ使用するかについての経験則はありますか?

stevemuse

方程式をコードに変換するための一般的なヒューリスティックを開発しようとしていますこの特定の質問は、合計関数を使用して方程式をMatlabに実装する方法を扱います

sum()と行列乗算の使用例:

この方程式を実装し、sum()関数を使用する必要があると考えました。

式1

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

次に、sum()関数を使用せずに、この同様の方程式を実装しました。

式2

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の行列乗算が合計を「処理」するときの原則は何ですか?

ありがとう!

rayryeng

線形代数のコンテキストでは、常に行列の乗算または行列やベクトルを扱うものを使用してください。具体的には、線形代数(行列での加算、減算、乗算などの組み合わせ)を使用して計算する必要があるものをすべて計算できる場合は、それを実行します。MATLABが作成された理由は、線形代数を使用して可能な限り高速に演算を実行するためでした。使用sumは確かに遅くなります。たとえば、この投稿を見てください:Matlabでの高速行列乗算

この投稿は洞察も提供します:Matlab行列の乗算速度MATLABもこのマルチスレッドを実行し、複数のコア向けに大幅に最適化されています。


テストが必要な場合は、sumまたは行列乗算を使用してこの量を計算できることがわかる、より簡単なケース(式1)に取り組みましょう次のJ行列乗算を使用して計算することできます

d = X*theta - y;
J = 1/(2*m)*(d.'*d);

上記では、内積の定義を使用して、差の2乗の合計を計算します。これはX*theta - ym x 1行列と見なされる行列乗算を使用して計算できます上記で具体的に計算しているのは、最急降下法によって最小化される線形回帰のコスト関数です。theta100 x 1になるようにかなり大きなパラメーターベクトルを作成し、10000000 x 100100個のパラメーターで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]

編集
0

コメントを追加

0

関連記事

分類Dev

Backbone.MarionetteでtriggerまたはtriggerMethodをいつ使用するかを決定する経験則はありますか?

分類Dev

.CSDEFと.CSCFGの内容について、経験則を知っている人はいますか?

分類Dev

オブジェクト指向プログラミングでオブジェクトをどの程度細かくするかについての経験則はありますか?

分類Dev

'name'キーを持つ配列の代わりにJSONオブジェクトを使用する場合の経験則はありますか?

分類Dev

Matlabで2つの行列から共通の行列を引いた外積の二乗和を計算するにはどうすればよいですか?

分類Dev

C ++の関数の戻り値の型としてポインターまたは参照を使用する際の経験則はありますか?

分類Dev

データセットをトレーニングセットと検証セットに分割する方法についての経験則はありますか?

分類Dev

Javaで1つのループだけで2つの行列を乗算するにはどうすればよいですか?

分類Dev

関数でグローバル変数をいつ使用するべきかに関する経験則

分類Dev

CLIを設計するとき、オプションまたはサブコマンドを使用するための好み/経験則はありますか?

分類Dev

RAMのアップグレードに関する経験則はありますか?

分類Dev

マルチプロセッシングを使用したNumpy行列の乗算は、次元が増加するにつれて突然遅くなります。

分類Dev

JUnitテストケースの工数を見積もるための経験則はありますか?

分類Dev

多くの変数について、いくつかのグループ間の倍率変化を計算するための高速でエレガントな方法はありますか?

分類Dev

2つの数値を乗算し、2つの数値が乗算されるたびにSUMを取得するにはどうすればよいですか?

分類Dev

Railsの経験則:2つの別々のモデル/テーブルに物を置くのはいつですか?

分類Dev

Androidでのインスタンス化に経験則はありますか?

分類Dev

行列をnumpyの対応するセルで乗算/除算する方法はありますか?

分類Dev

Rで次のように2つのベクトルまたは行列にベクトルを乗算することは可能ですか?

分類Dev

Elastic BeanstalkでWorkboxを使用した経験のある人はいますか?検出されない

分類Dev

Elastic BeanstalkでWorkboxを使用した経験のある人はいますか?検出されない

分類Dev

MATLAB:0:10:100の配列の各値にifループでいくつかの計算を適用する方法を理解する必要があります

分類Dev

データフレーム(または行列)の列に別のデータフレームの列を1つずつ乗算し、結果を合計するにはどうすればよいですか?

分類Dev

2つのベクトルの距離の2乗ノルムを計算するには、Rでクロスプロッド関数または基底関数を使用する必要がありますか?

分類Dev

アプリケーションのインストールとアップグレードに関する経験則はありますか?

分類Dev

Pythonでmath.factorial(n)を使用して階乗を計算すると、FLOPSがいくつありますか

分類Dev

Terracottaオープンソースを使用した経験はありますか?

分類Dev

Adaには、関数と出力パラメーターを持つプロシージャをいつ使用するかについての慣用的な規則がありますか?

分類Dev

Pythonで乗算の順序はいつ重要になりますか?

Related 関連記事

  1. 1

    Backbone.MarionetteでtriggerまたはtriggerMethodをいつ使用するかを決定する経験則はありますか?

  2. 2

    .CSDEFと.CSCFGの内容について、経験則を知っている人はいますか?

  3. 3

    オブジェクト指向プログラミングでオブジェクトをどの程度細かくするかについての経験則はありますか?

  4. 4

    'name'キーを持つ配列の代わりにJSONオブジェクトを使用する場合の経験則はありますか?

  5. 5

    Matlabで2つの行列から共通の行列を引いた外積の二乗和を計算するにはどうすればよいですか?

  6. 6

    C ++の関数の戻り値の型としてポインターまたは参照を使用する際の経験則はありますか?

  7. 7

    データセットをトレーニングセットと検証セットに分割する方法についての経験則はありますか?

  8. 8

    Javaで1つのループだけで2つの行列を乗算するにはどうすればよいですか?

  9. 9

    関数でグローバル変数をいつ使用するべきかに関する経験則

  10. 10

    CLIを設計するとき、オプションまたはサブコマンドを使用するための好み/経験則はありますか?

  11. 11

    RAMのアップグレードに関する経験則はありますか?

  12. 12

    マルチプロセッシングを使用したNumpy行列の乗算は、次元が増加するにつれて突然遅くなります。

  13. 13

    JUnitテストケースの工数を見積もるための経験則はありますか?

  14. 14

    多くの変数について、いくつかのグループ間の倍率変化を計算するための高速でエレガントな方法はありますか?

  15. 15

    2つの数値を乗算し、2つの数値が乗算されるたびにSUMを取得するにはどうすればよいですか?

  16. 16

    Railsの経験則:2つの別々のモデル/テーブルに物を置くのはいつですか?

  17. 17

    Androidでのインスタンス化に経験則はありますか?

  18. 18

    行列をnumpyの対応するセルで乗算/除算する方法はありますか?

  19. 19

    Rで次のように2つのベクトルまたは行列にベクトルを乗算することは可能ですか?

  20. 20

    Elastic BeanstalkでWorkboxを使用した経験のある人はいますか?検出されない

  21. 21

    Elastic BeanstalkでWorkboxを使用した経験のある人はいますか?検出されない

  22. 22

    MATLAB:0:10:100の配列の各値にifループでいくつかの計算を適用する方法を理解する必要があります

  23. 23

    データフレーム(または行列)の列に別のデータフレームの列を1つずつ乗算し、結果を合計するにはどうすればよいですか?

  24. 24

    2つのベクトルの距離の2乗ノルムを計算するには、Rでクロスプロッド関数または基底関数を使用する必要がありますか?

  25. 25

    アプリケーションのインストールとアップグレードに関する経験則はありますか?

  26. 26

    Pythonでmath.factorial(n)を使用して階乗を計算すると、FLOPSがいくつありますか

  27. 27

    Terracottaオープンソースを使用した経験はありますか?

  28. 28

    Adaには、関数と出力パラメーターを持つプロシージャをいつ使用するかについての慣用的な規則がありますか?

  29. 29

    Pythonで乗算の順序はいつ重要になりますか?

ホットタグ

アーカイブ