常には、行列乗法または線形代数コンテキストの行列またはベクトルを扱うものを使用します。具体的には、線形代数(行列の加法、減法、乗法などの組み合わせ)を使用して計算する必要があるものを計算できる場合は、それを行います。 MATLABが作成された理由は、線形代数を使用して操作をできるだけ速く実行することでした。 sum
を使用すると確かに遅くなります。たとえば、この投稿を見てください:fast matrix multiplication in Matlab
この投稿は洞察力を提供します:Matlab matrix multiplication speed。 MATLABはこのマルチスレッドを実行し、複数のコアに大きく最適化されています。
あなたがテストをしたい場合、我々はあなたがこの量を計算するsum
や行列の乗算のいずれかを使用することができることを見ることができます簡単にケース(式1)をタックルしましょう。 X*theta - y
がm x 1
行列として考えられている行列乗算を使用して計算することができ二乗差の合計を計算するために内積の定義を使用して上記
d = X*theta - y;
J = 1/(2*m)*(d.'*d);
:あなたはと行列の乗算を使用してもJ
を計算することができます。上記を考慮すると、具体的に計算しているのは、勾配降下によって最小化される線形回帰のコスト関数です。 theta
が100 x 1となるようにかなり大きなパラメータベクトルを作成し、データ行列を10000000 x 100
としましょう。そこでは1000個のデータポイントを100個のパラメータで取得します。私は自分のマシンにたくさんの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のインテルCore 2.3 GHzのCPUとのMacBook Proに16 GBのRAMを持っている:
>> test_grad
The timing for sum: 0.594337 seconds
The timing for matrix multiplication: 0.393643 seconds
あなたが見ることができるように、行列の乗算は(少なくとも私のマシン上の)各実行のために、平均して0.2秒の違いがありますtimeit
となります。
tl;dr
:行列乗算を使用できる場合は、実行します。これは、あなたのコードを実行することができる最速のものです。
あなたの質問を完全に理解しておらず、コード化された方程式の項で変数の次元を知ることは助けになります。それに加えて、いくつかの行列乗法規則は、それらの中間項のいくつかの和を含む。特別にMatlabとは何の関係もなく、数学のルールだけです。行列乗算関数を提供するソフトウェアは、これらの規則を組み込む必要があります(Matlabのように)。 – Hoki
編集内容が不明です。あなたはもう何を求めているのか分かりません。 – rayryeng
元の返信とメモをありがとう!私は方程式をコード変換するための一般的なヒューリスティックを開発しようとしています。この特別な質問は_Matlab_に_summation_関数を持つ方程式をどのように実装するかを扱っています。 以下のコードに基づいて、どちらの関数にもsum()を使用する必要はありませんでした。あなたのコード(ここでコピーしたもの)はうまくいきました。 'd = X * theta-y;' 'J = 1 /(2 * m)*(d。 '* d);' – stevemuse