Flugzeug-Montage an 4 (oder mehr) XYZ-Punkte
Ich habe 4 Punkte, die sehr nahe sind, werden auf einer Ebene - es ist der 1,4-Dihydropyridine-Zyklus.
Brauche ich um Entfernung berechnen, von C3 und N1 zu der Ebene, die besteht aus C1-C2-C4-C5.
Die Berechnung der Entfernung ist OK, aber passend Flugzeug ist ziemlich schwierig für mich.
1,4-DHP-Zyklus http://i.stack.imgur.com/dhNDo.png
1,4-DHP-Zyklus, eine andere Ansicht http://i.stack.imgur.com/6Xs0z.png
from array import *
from numpy import *
from scipy import *
# coordinates (XYZ) of C1, C2, C4 and C5
x = [0.274791784, -1.001679346, -1.851320839, 0.365840754]
y = [-1.155674199, -1.215133985, 0.053119249, 1.162878076]
z = [1.216239624, 0.764265677, 0.956099579, 1.198231236]
# plane equation Ax + By + Cz = D
# non-fitted plane
abcd = [0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129]
# creating distance variable
distance = zeros(4, float)
# calculating distance from point to plane
for i in range(4):
distance[i] = (x[i]*abcd[0]+y[i]*abcd[1]+z[i]*abcd[2]+abcd[3])/sqrt(abcd[0]**2 + abcd[1]**2 + abcd[2]**2)
print distance
# calculating squares
squares = distance**2
print squares
Zu machen, wie die Summe(squares) minimiert? Ich habe versucht kleinsten Quadrate, sondern es ist auch für mich hatte.
Versuchen, Fragen auf Mathe.stackexchange? Sie scheinen nicht zu müssen Codierung helfen atm 🙂
Ich bin mir nicht sicher, zu erwähnen, "1,4-Dihydropyridine-Zyklus" hilft in diesem Fall. Haben Sie gegoogelt "- Ebene passende python" ? Die fünfte Folge sieht vielversprechend aus...
Ich schrieb eine ähnliche Antwort here, die nützlich sein können (ignorieren Sie den letzten Teil über GEWICHTE)
Die verlinkten Informationen durch @MrE ist entscheidend, um zu verstehen, was meine Lösung hinter den kulissen tut. Ansonsten sind Sie einfach im Umgang mit einem magic black box.
Sie vermuten, dass Ihr Google-Blase ist die gleiche wie die Leser, die die Google-Blase, plus, dass die Blasen statisch bleiben über die Zeit. Weder ist wahr. Ein link ist mehr als hilfreich, eine vage ", sollten Sie google 'dies' und klicken Sie auf die x-te Ergebnis." Nur um meinen Standpunkt zu beweisen, derzeit das erste Ergebnis für eine solche Suche auf DuckDuckGo ist diese Frage auf StackOverflow.
Ich bin mir nicht sicher, zu erwähnen, "1,4-Dihydropyridine-Zyklus" hilft in diesem Fall. Haben Sie gegoogelt "- Ebene passende python" ? Die fünfte Folge sieht vielversprechend aus...
Ich schrieb eine ähnliche Antwort here, die nützlich sein können (ignorieren Sie den letzten Teil über GEWICHTE)
Die verlinkten Informationen durch @MrE ist entscheidend, um zu verstehen, was meine Lösung hinter den kulissen tut. Ansonsten sind Sie einfach im Umgang mit einem magic black box.
Sie vermuten, dass Ihr Google-Blase ist die gleiche wie die Leser, die die Google-Blase, plus, dass die Blasen statisch bleiben über die Zeit. Weder ist wahr. Ein link ist mehr als hilfreich, eine vage ", sollten Sie google 'dies' und klicken Sie auf die x-te Ergebnis." Nur um meinen Standpunkt zu beweisen, derzeit das erste Ergebnis für eine solche Suche auf DuckDuckGo ist diese Frage auf StackOverflow.
InformationsquelleAutor XuMuK | 2012-09-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass Sie passend zu einem Flugzeug ist nur leicht hier relevant. Was Sie versuchen zu tun ist, zu minimieren insbesondere Funktion ausgehend von einer Vermutung. Für diese Verwendung
scipy.optimize
. Beachten Sie, dass es gibt keine Garantie, dass dies die weltweit optimal Lösung, nur lokal optimal. Eine andere ausgangsvoraussetzung, kann konvergieren zu einem anderen Ergebnis, das funktioniert gut, wenn Sie anfangen, in der Nähe der lokalen minima, die Sie suchen.Ich habe mir die Freiheit genommen, zu bereinigen Sie Ihren code, indem unter Ausnutzung der numpy - Rundfunk:
Gibt es:
Sie sagen, lokal optimal, aber gibt es eine Möglichkeit zu garantieren, eine Global optimale Lösung, die ohne Rücksicht auf die Anfangsbedingungen? Ich weiß nicht genug linearen algebra zu sagen für mich
im Allgemeinen ist die Antwort Nein, für eine beliebige Kostenfunktion es gibt keine Möglichkeit zu garantieren, sind Sie in der globalen minimum vs lokal. Es gibt jedoch eine wichtige Teilmenge der (lineare) Probleme, wo können wir beides garantieren und finden Sie die Lösung in polynomialer Zeit. Dies ist in der Tat eine der großen stärken der linearen algebra. Viele Probleme, die nicht-linear angenähert werden können, um eine lineare, also können Sie lösen die Ungefähre problem genau so schön.
sollte es nicht absolute Abstand sollten minimiert werden?
es hängt davon ab! Die L1-und L2-Normen (absolute vs mean squared) geben immer die gleiche Rangfolge, doch sind verschiedene Massnahmen, wie weit Sie vom Ziel entfernt sind. Für die iterative Löser das heißt, Sie haben die gleichen Mindestanforderungen (und damit die gleiche "richtige" Antworten), aber unterschiedliche Steigungen. Einen anderen Verlauf, können einige Löser man die Lösung schneller. In vielen Fällen, aber nicht alle, L2 Normen konvergieren schneller.
InformationsquelleAutor Hooked
Das klingt ungefähr richtig, aber Sie sollten ersetzen der nichtlinearen Optimierung mit einer SVD. Die folgende schafft das Trägheitsmoment tensor, M, und dann SVD ist es, die normal auf die Ebene. Dies sollte eine enge Annäherung an die least-squares-fit und viel schneller und vorhersehbarer. Es gibt die point-cloud-center und die normalen.
Beispiel: Konstruieren Sie ein 2D-cloud (10, 100), ist Dünn in der x-Richtung und 100-mal so groß in y-Richtung:
Fit Flugzeug ist sehr knapp (10, 100) mit einem normalen sehr knapp entlang der x-Achse.
Mit
scipy.optimize.leastsq
ist toll, aber (vorausgesetzt, ich wusste nicht fügen Sie ein Fehler), ist dies der Richtige Weg zu tun, total-least-squares. en.wikipedia.org/wiki/Total_least_squaresAußerdem: wenn Sie wirklich wollen, zu lösen, um das volle nichtlineare problem, mithilfe des SVD-basierten fit ist ein schneller Weg, um ein sehr guter Ausgangspunkt.
Warum sollte dieser weniger präzise? Dies ist in der Tat präziser als die nicht-linearen Optimierung.
Ich bin rusty auf das jetzt. Was ich dachte war, dass die Summe der kleinsten Quadrate ist die Summe der quadrierten Fehler in der Erwägung, dass die SVD-Lösung geben Ihnen (glaube ich) die Summe der quadrierten rsin(theta). Natürlich, für kleine theta, rsin(theta) ist sehr nah an der euklidische Fehler, aber für große Fehler, nicht so viel.
InformationsquelleAutor Ben
Least-squares-fit ist ein Flugzeug einfach. Die Gleichung für eine Ebene lautet: ax + by + c = z. So einrichten Matrizen wie diese mit all Ihren Daten:
Und
Und
In anderen Worten: Ax = B. Jetzt für x lösen, das sind Ihre Koeffizienten. Aber da Sie mehr als 3 Punkte, das system ist über-bestimmt, so müssen Sie die linke pseudo-inverse. Die Antwort ist also:
Und hier ist einige einfache Python-code mit einem Beispiel:
Die Lösung für Ihre Punkte:
von Ihnen positiv bewertet werden für die Grafik
warten Sie, ich vielleicht nicht sehen bei diesem code lang genug, aber diese Lösung ist nicht iterativ, richtig? Wieder, nur ein Erster Eindruck, aber das hört sich nicht sehr "maschinelles lernen" aus Mangel an einem besseren Weg, es zu setzen. Bedeutet das, dass diese Lösung nur dauert die erste Vermutung das Evangelium?
Diese Methode ist nicht robust zu singulären Matrizen. Gehen, um zu versuchen, andere
Diese Lösung ist nicht iterativ, und es ist nicht in der Maschine zu lernen. Es ist nur ordinary-least-squares, die einfach nur straight nach vorne Mathematik, das minimiert die Fehler des Modells an. Nein, das funktioniert nicht mit singulären Matrizen, und ich bin mir nicht sicher, was wird. Ich denke, das bedeutet, es ist etwas grundlegend falsch in der Formulierung des Problems.
InformationsquelleAutor Ben
Hier ist ein Weg. Wenn Sie Ihre Punkte sind P[1]..P[n], dann berechnen Sie den Mittelwert M dieser und subtrahieren es von jedem Punkte p[1]..p[n]. Berechnen Sie C = Sum{ p[i]*p[i]'} ("Kovarianz" matrix der Punkte). Neben diagonalise C, das orthogonal U und diagonalen E, so dass C = U*E*U'. Wenn Sie Ihre Punkte sind in der Tat auf eine Ebene dann einen der Eigenwerte (d.h. die diagonal-Einträge von E) sehr klein sein wird (mit perfekter Arithmetik, es wäre 0). In jedem Fall, wenn die j 'te eine von diesen ist der kleinste, dann lassen Sie die j' te Spalte von U (A,B,C) und berechne D = -M'*N. Diese Parameter definieren die "besten" Ebene, die eine, so dass die Summe der Quadrate der Entfernungen von P [], um das Flugzeug am wenigsten.
InformationsquelleAutor dmuir
Anderen Weg, abgesehen von svd, um schnell zu einer Lösung gelangen, während der Umgang mit Ausreißern ( wenn Sie eine große Datenmenge ) ist ransac :
Ich bin nicht sicher, was du meinst, aber voxels entspricht " XYZ " in der ursprünglichen Frage - Sie brauchen nicht zu Vorverarbeiten Sie in irgendeiner Weise.
InformationsquelleAutor Dan Erez