Array Division - Übersetzung von MATLAB nach Python

7

Ich habe diese Codezeile in MATLAB, geschrieben von jemand anderem:

%Vor%

Ich muss es in Python übersetzen. a, b und c sind alle Arrays. Die Dimensionen, die ich derzeit zum Testen des Codes verwende, sind:

a: 18x1,
b: 25x18,

was mir c mit den Dimensionen 1x25 gibt.

Die Arrays sind nicht quadratisch, aber ich würde nicht wollen, dass der Code versagt, wenn sie es waren. Kann jemand genau erklären, was diese Zeile (mathematisch) macht und wie man es in Python macht? (d. h. das Äquivalent für die eingebaute Mrdivide-Funktion in MATLAB, wenn sie in Python existiert?)

    
EmilyS 16.06.2009, 13:54
quelle

5 Antworten

7

Die Zeile

%Vor%

berechnet die Lösung der Gleichung c b = a T für c . Numpy hat keinen Operator, der das direkt macht. Stattdessen sollten Sie b T c T = für c T lösen und transponieren das Ergebnis:

%Vor%     
Vebjorn Ljosa 17.06.2009, 18:41
quelle
7

Das Symbol% ​​co_de% ist die Matrix rechts Divisions-Operator in MATLAB, die die / Funktion. Aus der Dokumentation geht hervor, dass die Matrix-Right-Division mit der linken Matrix-Division folgendermaßen zusammenhängt:

%Vor%

Wenn mrdivide eine quadratische Matrix ist, ist A ungefähr gleich B/A (obwohl sie auf eine andere, robustere Weise berechnet wird). Andernfalls ist B*inv(A) die Lösung im Sinne der kleinsten Quadrate für das unter- oder überbestimmte Gleichungssystem x = B/A . Weitere Einzelheiten über die Algorithmen zur Lösung des Gleichungssystems verwendet wird href="https://www.mathworks.com/help/matlab/ref/mldivide.html#bt4jslc-6"> hier LAPACK oder BLAS werden unter der Haube verwendet.

Das NumPy Paket für Python enthält eine Routine x*A = B zur Berechnung der kleinsten Quadrate-Lösung auf ein System von Gleichungen. Diese Routine liefert Ihnen wahrscheinlich vergleichbare Ergebnisse wie die Funktion lstsq in MATLAB, aber es ist unwahrscheinlich, dass sie genau ist. Irgendwelche Unterschiede in den zugrundeliegenden Algorithmen, die von jeder Funktion verwendet werden, werden wahrscheinlich zu Antworten führen, die sich leicht voneinander unterscheiden (d. H., Dass ein Wert von 1,0 zurückgegeben werden kann, während der andere einen Wert von 0,999 zurückgibt). Die relative Größe dieses Fehlers könnte größer sein, abhängig stark von dem spezifischen System von Gleichungen, die Sie lösen.

Um mrdivide zu verwenden, müssen Sie möglicherweise Ihr Problem etwas anpassen. Es scheint, dass Sie eine Gleichung der Form cB = a lösen möchten, wobei B 25-mal-18 ist, a 1- von -18, und c ist 1-mal-25. ein transponieren zu beiden Seiten der Anwendung gibt Ihnen die Gleichung B T c T = a T , was eine Standardform ist (dh Ax = b ). Die Argumente für lstsq sollten (in dieser Reihenfolge) T (eine 18-mal-25-Matrix) und a T (ein Array mit 18 Elementen). lstsq sollte ein Array mit 25 Elementen zurückgeben ( c T ).

Hinweis: Während NumPy keinen Unterschied zwischen einem 1-by-N- oder N-by-1-Array macht, tut MATLAB das und ruft Sie an, wenn Sie nicht das richtige verwenden.

    
gnovice 16.06.2009 14:07
quelle
5

In% Matlab bedeutet A.' das Transponieren der A-Matrix. Mathematisch wird also im Code A T / B

erreicht

Wie wird die Matrix-Aufteilung in Python (oder einer anderen Sprache) implementiert? (Hinweis: Lassen Sie uns über eine einfache Unterteilung der Form A/B gehen; für Ihr Beispiel müssten Sie das tun mach zuerst A T und dann A T / B, und es ist ziemlich einfach, die Transponierungsoperation in Python | links-wie-eine-Übung durchzuführen:) |)

Sie haben eine Matrixgleichung C * B = A (Sie möchten C als A / B finden)

RIGHT DIVISION (/) ist wie folgt:

C * (B * B T ) = A * B T

Sie isolieren dann C durch Invertieren (B * B T )

d. h.

C = A * B T * (B * B T ) '----- [1]

Um die Matrix-Aufteilung in Python (oder einer anderen Sprache) zu implementieren, sollten Sie die folgenden drei Methoden verwenden.

  • Matrixmultiplikation
  • Matrix transponieren
  • Matrix invers

Wenden Sie sie dann iterativ an, um eine Teilung wie in [1] zu erreichen.

Nur müssen Sie A T / B tun, daher sollte Ihre letzte Operation nach der Implementierung der drei grundlegenden Methoden sein:

A T * B T * (B * B T )

Hinweis: Vergessen Sie nicht die Grundregeln der Operator-Priorität:)

    
Suvesh Pratapa 16.06.2009 14:07
quelle
1

[redigiert] Als Suvesh darauf hinwies, war ich vorher völlig falsch. Dennoch kann numpy die Prozedur, die er in seinem Post gibt, leicht ausführen:

%Vor%     
Autoplectic 16.06.2009 14:34
quelle
1

Sie können dies auch mit der Pseudo-Umkehrung von B erreichen und anschließend das Ergebnis mit A multiplizieren. Versuchen Sie es mit numpy.linalg.pinv und kombinieren Sie dies mit der Matrixmultiplikation über numpy.dot :

%Vor%     
rayryeng 07.03.2018 16:20
quelle