Frage

Ich habe diese Zeile Code in MATLAB, von jemand anderem geschrieben:

c=a.'/b

Ich brauche es in Python zu übersetzen. a, b und c sind alle Arrays. Die Dimensionen, die ich zur Zeit bin mit dem Code zu testen sind:

a: 18x1,
b: 25x18,

, die mir c mit den Abmessungen 1x25 gibt.

Die Arrays sind nicht quadratisch, aber ich würde der Code nicht scheitern wollen, wenn sie waren. Kann mir jemand erklären, was genau diese Linie (mathematisch) tut, und wie es in Python zu tun? (Das heißt, das äquivalent für die eingebaute in mrdivide Funktion in MATLAB, wenn es in Python existiert?)

War es hilfreich?

Lösung

Die Zeile

c = a.' / b

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

c = numpy.linalg.lstsq(b.T, a.T)[0].T

Andere Tipps

Das Symbol / ist die Matrix rechts Divisions-Operator in MATLAB, die die mrdivide Funktion. Aus der Dokumentation wird Matrix rechts Sparte href="https://www.mathworks.com/help/matlab/ref/mldivide.html" rel="nofollow noreferrer"> Matrix linke Abteilung in dem

B/A = (A'\B')'

Wenn A eine quadratische Matrix ist, ist B/A etwa gleich B*inv(A) (obwohl es in einer anderen, robusteren Art und Weise berechnet wird). Ansonsten ist x = B/A die Lösung im Sinne der kleinsten Quadrate an die unter- oder überbestimmtes Gleichungssystem x*A = B. Weitere Einzelheiten über die Algorithmen zur Lösung des Gleichungssystems verwendet wird, gegeben hier . Typischerweise Pakete wie LAPACK oder BLAS unter der Haube verwendet werden.

Das NumPy Paket für Python enthält eine Routine lstsq zur Berechnung der kleinsten Quadrate-Lösung auf ein System von Gleichungen. Diese Routine wird wahrscheinlich geben Sie vergleichbare Ergebnisse die mrdivide Funktion in MATLAB zu verwenden, aber es ist unwahrscheinlich, dass genau . Etwaige Unterschiede in den zugrunde liegenden Algorithmen, die von jeder Funktion verwendet werden resultieren wahrscheinlich in Antworten, die geringfügig voneinander unterscheiden (das heißt man kann einen Wert von 1,0 zurück, während die andere einen Wert von 0,999 zurückkehren können). Die relative Größe dieses Fehlers könnte am Ende wurde größer, je stark von dem spezifischen System von Gleichungen zu lösen Sie.

Zur Nutzung lstsq, müssen Sie Ihr Problem leicht anzupassen. Es scheint, dass Sie eine Gleichung der Form lösen wollen cB = a , wobei B 25-by-18, a ist 1- by-18 und c 1-für-25. ein Anwenden von transponieren zu beiden Seiten gibt Ihnen die Gleichung B T c T = a T , die eine Standardform (dh Ax = b ). Die Argumente für lstsq sollten (in dieser Reihenfolge) seine B T (ein 18-by-25-Array) und a T (eine 18-Element-Array). lstsq zurückkehren sollte eine 25-Element-Array ( c T ).

Hinweis: während NumPy macht keinen Unterschied zwischen einer 1-durch-N oder N-für-1-Array, MATLAB sicherlich der Fall ist, und wird an Sie schreien, wenn Sie nicht die richtige eine solche verwenden.

In Matlab, bedeutet A.' die eine Matrix zur Umsetzung. So mathematisch, was im Code erreicht wird, ist A T / B.


Wie über die Implementierung von Matrixteilung in Python (oder eine beliebige Sprache) , um (Hinweis: Lassen Sie uns eine einfache Aufteilung des Formulars A/B gehen, denn Ihr Beispiel müssten Sie A tun T und dann A T / B als nächstes, und es ist ziemlich einfach, die Transponierung in Python zu tun | links-als-Übung:) |)

Sie haben eine Matrixgleichung C * B = A (Sie wollen C als A / B finden)

RECHTS DIVISION (/) ist wie folgt:

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

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

d.h.

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

Daher Matrix Teilung in Python zu implementieren (oder eine beliebige Sprache), erhalten die folgenden drei Methoden.

  • Matrix-Multiplikation
  • Matrix transponiert
  • Matrix inverse

Dann wendet sie iterativ Division zu erreichen, wie in [1].

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

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

Hinweis: Sie nicht die Grundregeln des Operator Vorrang vergessen:)

[editiert] Wie Suvesh erwähnt, war ich schon völlig falsch. jedoch kann numpy noch leicht tun, das Verfahren, das er in seinem Beitrag gibt:

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I

Sie können auch nähern dies die pseudo-inverse von B mit dann poste dieses Ergebnis mit A multipliziert wird. Versuchen Sie es mit numpy.linalg.pinv dann kombinieren diese mit Matrix Multiplikation über numpy.dot :

c = numpy.dot(a, numpy.linalg.pinv(b))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top