Numpy vs mldivide,"\" matlab-operator
A \ B
in matlab gibt es eine spezielle Lösung, während numpy.linalg.lstsq nicht.
A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_mldivide =
0
4
0.66666666666667
c_lstsq = np.linalg.lstsq([[1 ,2, 0],[0, 4, 3]],[[8],[18]])
print c_lstsq
c_lstsq = (array([[ 0.91803279],
[ 3.54098361],
[ 1.27868852]]), array([], dtype=float64), 2, array([ 5.27316304,1.48113184]))
- Wie funktioniert mldivide
A \ B
in matlab geben Sie eine spezielle Lösung? - Diese Lösung ist nützlich bei der Erreichung der Rechengenauigkeit?
- Warum ist diese Lösung besonders und wie könnten Sie das umsetzen in numpy?
- Was meinst du mit "spezielle Lösung"? Die Lösung von python (
[0.918 3.541 1.279]
) ist auch eine korrekte Lösung. Sie haben 2 Gleichungen in 3 unkowns es gibt also keine eindeutige Lösung. Die Lösungen sind[-1 9/2 0]+s*[3/2 -3/4 1]
für jede reelle Zahls
. Sets=2/3
für die Matlab-Lösung unds=1.27868852
für die Python-Lösung. - Es ist nicht nur über die Angabe einer richtigen Lösung. mldivide gibt immer eine Lösung, die den Vektor der n nicht-null-Elemente, wobei n der Rang der matrix, wo, wie numpy dies nicht tut. Ich bin auf der Suche zu bekommen, die genau die gleiche Lösung in numpy als durch mldivide.
- Die Oktave
A\b
Lösung ist die gleiche wie dienumpy
ein. MATLAB doc schlägtpinv(A)*B
als rechnerisch mehr teure Methode. In der Oktave erzeugt die gleiche Sache.numpy
hat auchpinv
, witth das gleiche Ergebnis. - Die operation, die Sie suchen, nicht eine einzelne numerische Lösung, so sehe ich nicht, warum Sie erwarten, um zu erhalten das gleiche Ergebnis, wenn Sie Fragen, verschiedene Implementierungen zu geben, eine einzelne Antwort auf diese mehr Allgemeinen Frage. (Obwohl wenn man es Recht, MATLAB sollte auch wieder ein least-squares denke mal die Frage)
- Es gibt keine least-squares-Lösung---es gibt eine unendliche Anzahl von exakten Lösungen. Wenn etwas anderes in deinem code hängt sich immer auf die "richtige" Lösung, dann müssen Sie entweder geben Sie einen anderen Zustand oder es gibt ein problem mit Ihrem Algorithmus.
- Oops, danke @David, du hast Recht. Ich habe es verwechselt mit den eingeschränkten Fall, vor allem aufgrund der OP ' s Gebrauch von
lstsq
...sorry. - Wenn es eine unendliche Anzahl von genauen Lösungen
lstsq
gibt die Lösung mit minimaler norm; d.h., derjenige mit der kleinsten Summe der Quadrate der Variablen. Dies ist etwas, das man beschreiben könnte als "least squares", obwohl "minimum-norm" ist ein Begriff vorzuziehen, um Verwechslungen zu vermeiden. - Ich glaube nicht, dass ich absolut Zustimmen. Ein damit-Quadrate-Lösung bedeutet, dass der Rest (Fehler) in der ungefähren Lösung minimiert least-squares-Sinne, D. H. der Abstand von der richtigen Lösung auf die Ungefähre Lösung minimiert wird. Kommissionierung die Lösung mit der kleinsten norm ist ein Weg, um zu bestimmen, welche Lösung zu wählen, genau wie Matlab versucht, wie viele Elemente der Vektor null wie möglich. Also ich denke, deine Methode gibt eine least-squares-Lösung, verwendet aber eine andere Art der Kommissionierung, die Lösung zurück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für unter-bestimmt Systeme wie Ihr Rang ist kleiner als die Anzahl der Variablen),
mldivide
gibt eine Lösung mit, wie viele null-Werte wie möglich. Die Variablen werden auf null gesetzt wird, bis zu seiner willkürlichen Wahl.Im Gegensatz dazu, die
lstsq
Methode gibt die Lösung mit minimaler norm in solchen Fällen: das ist unter der unendlichen Familie von genauen Lösungen, die Sie auswählen wird, welche die kleinste Summe der Quadrate der Variablen.So, die "Besondere" Lösung der Matlab ist etwas willkürlich: man kann jede der drei Variablen auf null in dieses problem. Die Lösung angesichts von NumPy ist in der Tat mehr Besondere: es ist eine einzigartige minimal-norm-Lösung
Welche Lösung ist besser für Ihre Zwecke hängt davon ab, was Ihr Ziel ist. Die nicht-Eindeutigkeit der Lösung ist in der Regel ein Grund, überdenken Sie Ihre Herangehensweise an die Gleichungen. Aber da du gefragt, hier ist NumPy-code, erzeugt Matlab-Art-Lösungen.
Für dein Beispiel gibt es drei "Besondere" Lösungen, von denen das Letzte ist, was Matlab wählt.
np.linalg.solve(mA, vB)
funktioniert nur für quadratische Matrizen. Gibt es einen solver für jede Größe der matrix (natürlich welche die gleiche Anzahl von Zeilen wievB
)?