2016-07-03 8 views
3

の方程式をコードに変換する一般的なヒューリスティックを開発しようとしています。この特定の質問は、の合計での関数をMatlabに実装する方法を扱います。マトリクス乗算、sum()、またはforループをMatlabで使用する場合の経験則がありますか?

行列乗算対和()を使用しての例:

equation1

J = 1/(2*m) * sum((X*theta - y).^2); 
:私はこの式を実装し、私は合計()関数を使用するために必要な考え

次に、sum()関数を使う必要なしに、この同様の式を実装しました!

equation2

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の行列の乗算は和を "扱う" ときのための原則は何ですか?

ありがとうございました!

+0

あなたの質問を完全に理解しておらず、コード化された方程式の項で変数の次元を知ることは助けになります。それに加えて、いくつかの行列乗法規則は、それらの中間項のいくつかの和を含む。特別にMatlabとは何の関係もなく、数学のルールだけです。行列乗算関数を提供するソフトウェアは、これらの規則を組み込む必要があります(Matlabのように)。 – Hoki

+0

編集内容が不明です。あなたはもう何を求めているのか分かりません。 – rayryeng

+0

元の返信とメモをありがとう!私は方程式をコード変換するための一般的なヒューリスティックを開発しようとしています。この特別な質問は_Matlab_に_summation_関数を持つ方程式をどのように実装するかを扱っています。 以下のコードに基づいて、どちらの関数にもsum()を使用する必要はありませんでした。あなたのコード(ここでコピーしたもの)はうまくいきました。 'd = X * theta-y;' 'J = 1 /(2 * m)*(d。 '* d);' – stevemuse

答えて

6

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

この投稿は洞察力を提供します:Matlab matrix multiplication speed。 MATLABはこのマルチスレッドを実行し、複数のコアに大きく最適化されています。


あなたがテストをしたい場合、我々はあなたがこの量を計算するsumや行列の乗算のいずれかを使用することができることを見ることができます簡単にケース(式1)をタックルしましょう。 X*theta - ym 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:行列乗算を使用できる場合は、実行します。これは、あなたのコードを実行することができる最速のものです。

関連する問題