2016-07-03 2 views
3

Ich versuche allgemeine Heuristiken für zu entwickeln, die Gleichungen in Code übersetzen. Diese spezielle Frage befasst sich mit der Implementierung einer Gleichung mit einer Summierung Funktion in Matlab.Gute Faustregeln für die Verwendung von Matrixmultiplikation, sum() oder for-Schleife in Matlab?

Ein Beispiel für eine Summe() verwendet vs. Matrixmultiplikation:

I dieser Gleichung umgesetzt und dachte ich eine Summe() Funktion zu verwenden, benötigt:

equation1

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

Dann habe ich diese ähnliche Gleichung implementiert, ohne eine sum() -Funktion verwenden zu müssen!

equation2

theta = theta - (alpha/m) * ((X*theta - y)'*X)'; 

Wo:

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) 

Was sind die Grundsätze für die sind, wenn Matlab Matrixmultiplikation "Griffe", um die Summe?

Vielen Dank!

+0

Nicht sicher, Ihre Frage perfekt zu verstehen, und das Wissen der Dimensionen der Variablen in den Begriffen Ihrer codierten Gleichungen würde helfen. Abgesehen davon enthalten einige Matrixmultiplikationsregeln einige Summierungen ihrer Zwischenterme. Matlab hat nichts zu tun, nur die Mathematikregeln. Jede Software, die Matrixmultiplikationsfunktionen anbietet, sollte diese Regeln enthalten (wie es Matlab tut). – Hoki

+0

Ihre Bearbeitung ist unklar. Ich weiß nicht, was du fragst. – rayryeng

+0

Danke für die ursprüngliche Antwort und die Notiz! Ich versuche allgemeine Heuristiken für _translating Gleichungen zu code_ zu entwickeln. In dieser speziellen Frage ging es darum, eine Gleichung mit einer _summation_ -Funktion in _Matlab_ zu implementieren. Basierend auf Ihrem Code unten sieht es so aus, als ob ich für beide Funktionen sum() nicht verwenden müsste. Dein Code (hier kopiert) hätte funktioniert. 'd = X * Theta - y;' 'J = 1/(2 * m) * (d. '* D);' – stevemuse

Antwort

6

Immer Verwenden Sie Matrixmultiplikation oder irgendetwas, das sich mit Matrizen oder Vektoren in einem linearen Algebra-Kontext beschäftigt. Insbesondere, wenn Sie alles berechnen können, was Sie mit linearer Algebra berechnen müssen (eine Kombination aus Addition, Subtraktion, Multiplikation usw. auf Matrizen), dann tun Sie es. Der Grund, warum MATLAB erstellt wurde, war, Operationen mit linearer Algebra so schnell wie möglich durchzuführen. Mit sum wäre sicherlich langsamer. Zum Beispiel, sieh diesen Beitrag: fast matrix multiplication in Matlab

Dieser Beitrag bietet auch Einblick: Matlab matrix multiplication speed. MATLAB führt auch dieses Multithreading durch und ist stark für mehrere Kerne optimiert.


Wenn Sie einen Test möchten, lassen Sie sich den leichten Fall angehen (Gleichung 1), wo wir sehen können, dass Sie entweder sum oder Matrixmultiplikation verwenden können diese Menge zu berechnen. Sie können J berechnen auch mit Matrixmultiplikation mit:

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

Die oben verwendet die Definition des Skalarprodukts die Summe der quadrierten Differenzen zu berechnen, die Matrix-Multiplikation berechnet werden kann mit dem X*theta - y als m x 1 Matrix betrachtet wird. Mit dem Obigen rechnen Sie speziell die Kostenfunktion für die lineare Regression, die durch Gradientenabstieg minimiert werden soll. Lassen Sie uns einen ziemlich großen Parametervektor für theta zu 100 x 1 erstellen, und eine Datenmatrix zu 10000000 x 100, wo wir 10 Millionen Datenpunkte zu 100 Parametern haben. Ich habe viel RAM auf meinem Computer, so dass Sie diesen Test möglicherweise nicht ausführen können. Ich werde diese auch alle auf Zufallszahlen initialisieren und einen Seed setzen, um die Reproduzierbarkeit sicherzustellen. Lassen Sie uns timeit verwenden und sehen, wie lange diese beiden dauern werden.Dies ist eine Testfunktion, die ich schrieb:

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 

Wenn Sie diese Funktion in MATLAB laufen, tut es umfangreiche Tests zwischen sum mit und Matrixmultiplikation verwenden.

Dies ist, was ich bekomme, wenn ich diese Funktion ausführen. Ich habe 16 GB RAM auf einem MacBook Pro mit einem i7 Intel Core 2,3 GHz Prozessor:

>> test_grad 
The timing for sum: 0.594337 seconds 
The timing for matrix multiplication: 0.393643 seconds 

Wie Sie sehen können, Matrixmultiplikation (zumindest auf meinem Rechner) eine 0,2 Sekunden Differenz im Durchschnitt für jeden Lauf mit timeit.


tl;dr: Wenn Sie Matrixmultiplikation verwenden können, es zu tun. Es ist der schnellste, mit dem Sie Ihren Code laufen lassen können.

Verwandte Themen