2012-06-09 13 views
11

Mam zestaw punktów (z nieznanymi współrzędnymi) i macierz odległości. Muszę znaleźć współrzędne tych punktów, aby je narysować i pokazać rozwiązanie mojego algorytmu.Znajdowanie współrzędnych punktów z macierzy odległości

Mogę ustawić jeden z tych punktów we współrzędnych (0,0), aby je uprościć i znaleźć pozostałe. Czy ktoś może mi powiedzieć, czy możliwe jest znalezienie współrzędnych innych punktów, a jeśli tak, to w jaki sposób?

Z góry dziękuję!

EDIT Zapomniałem że trzeba współrzędnych w x, y tylko

+0

To ... będzie wymagało wiele brutalnego wymuszania ... –

+1

Rozważ trzy punkty (trójkąt). Istnieją dwie orientacje i nieskończona liczba obrotów, które dałyby tę samą matrycę odległości. –

+0

O krok dalej, czy mówimy o jednowymiarowej przestrzeni, czy o dwóch, czy trzech, czy czterech ... Odpowiedź zmieni się w każdym przypadku. O (0,0), czy powinniśmy zaakceptować jego dwuwymiarowy? – Rasman

Odpowiedz

4

Etap 1 dowolnie przydzielić jeden punkt P1 jako (0,0).

Krok 2, arbitralnie przypisz jeden punkt P2 wzdłuż dodatniej osi X. (0, Dp1p2)

Etap 3, znaleźć punkt P3 tak, że

Dp1p2 ~= Dp1p3+Dp2p3 
Dp1p3 ~= Dp1p2+Dp2p3 
Dp2p3 ~= Dp1p3+Dp1p2 

i ustawiony, że punkt w „pozytywnej” domeny Y (jeśli spełnia którykolwiek z tych kryteriów, temperatura powinna być umieszczona na osi P1P2).
Użyj prawo cosinus aby określić odległość:

cos (A) = (Dp1p2^2 + Dp1p3^2 - Dp2p3^2)/(2*Dp1p2* Dp1p3) 
P3 = (Dp1p3 * cos (A), Dp1p3 * sin(A)) 

Z powodzeniem zbudował przestrzeń ortonormalną i umieszczone trzy punkty w tej przestrzeni.

Krok 4: Aby ustalić wszystkie pozostałe punkty, powtórz krok 3, aby uzyskać wstępną współrzędną y. (Xn, Yn).
Porównaj odległość {(Xn, Yn), (X3, Y3)} do Dp3pn w macierzy. Jeśli jest identyczny, udało ci się zidentyfikować współrzędne dla punktu n. W przeciwnym razie punkt n ma wartość (Xn, -Yn).

Uwaga istnieje alternatywa do kroku 4, ale to jest zbyt dużo matematyki na sobotnie popołudnie

+0

@BrunoBruck prawo cosinus podać kąt (pierwsze równanie) między P1P2 i P1P3. Kolejną częścią jest przeniesienie rzutu P3 na oś P1P2. Znając odległość P1P3 i ustawiając ją jako przeciwprostokątną trójkąta, wartości X i Y są po prostu cos i sinus razy w stosunku do przeciwprostokątnej, odpowiednio. – Rasman

+0

To, co zrobiłeś z P2, jest w porządku, ale w przypadku P3 nie mogę wybrać punktu mojego zestawu, który nie znajduje się w tym samym wierszu P1 i P2, i powiedzieć na pewno, że jest na osi Y. – Trino00

+0

OK, myślę, że mam to. Na początku udajemy, że P3 znajduje się na osi Y, aby uzyskać trójkąt prostokątny iw takim przypadku możemy utworzyć równania dla współrzędnych. Ale znamy rzeczywistą odległość między P3 i P2, więc jesteśmy w stanie uzyskać rzeczywisty kąt między P1P2 i P1P3, a używając go w równaniach dla współrzędnych możemy uzyskać rzeczywiste wartości dla Xp3 i Yp3. Czy rozumiem, prawda? – Trino00

1

Jeśli punkty P, Q i R masz PQ, QR, i rp w macierzy, trzeba trójkąt.

Wszędzie tam, gdzie macie trójkąt w macierzy, możecie obliczyć jedno z dwóch rozwiązań dla tego trójkąta (niezależnie od transformacji euklidesowej trójkąta na płaszczyźnie). Oznacza to, że dla każdego trójkąta, który obliczysz, jego odbicie lustrzane jest również trójkątem, który spełnia ograniczenia odległości dla p, q i r. Fakt, że istnieją dwa rozwiązania nawet dla trójkąta, prowadzi do problemu chiralności: Musisz wybrać chiralność (orientację) każdego trójkąta, a nie wszystkie wybory mogą prowadzić do możliwego rozwiązania problemu.

Niemniej jednak, mam kilka sugestii. Jeśli liczba wpisów jest mała, należy rozważyć użycie numeru simulated annealing. Możesz włączyć chiralność do etapu wyżarzania. Będzie to powolne w przypadku dużych systemów i może nie dojść do perfekcyjnego rozwiązania, ale w przypadku niektórych problemów jest to najlepsze rozwiązanie.

Druga sugestia nie zapewni Ci idealnego rozwiązania, ale spowoduje dystrybucję błędu: method of least squares. W twoim przypadku funkcją celu będzie błąd między odległościami w twojej macierzy, a rzeczywistymi odległościami między twoimi punktami.

+0

Dziękuję za odpowiedź. Nie wiem, czy to jest najlepsze podejście, ponieważ w niektórych cenariach mam dużo punktów, a metaheurystyka nie zawsze zwraca optymalne rozwiązanie, lub w tym przypadku rozwiązanie możliwe. Mogłabym spędzać z nim dużo czasu i nadal nie otrzymuję możliwej odpowiedzi. – Trino00

+0

@DeepYellow: Podoba mi się twoja odpowiedź po części dlatego, że może pomóc w odpowiedzi na inne, trudniejsze pytanie, opublikowane wczoraj przez innego użytkownika. Próbowałem odpowiedzieć na to inne pytanie i nie udało mi się. Jeśli wyzwanie Cię interesuje, oto URL: http://stackoverflow.com/questions/10957359/minimal-rectangle-containing-all-intersections-of-lines – thb

+0

@thb: Dzięki za wskazanie tego pytania. Wysłałem to, co uważam za poprawne rozwiązanie, daj mi znać, co myślisz. –

11

Odpowiedzi oparte na kątach są uciążliwe w implementacji i nie można ich łatwo uogólnić na dane w wyższych wymiarach.Lepszym rozwiązaniem jest to, że wymienione w moje i WimC-tych odpowiedziach here: podany macierz odległości D(i, j) zdefiniować

M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2) 

które powinny być pozytywnym pół określony matryca z rankingu równa minimalnej euklidesowej wymiaru k w której punkty mogą być osadzonym. Współrzędne punktów można następnie uzyskać z k wektorów własnych v(i) z M odpowiadających niezerowej wartości własnej q(i): umieścić wektory sqrt(q(i))*v(i) jako kolumny w macierzy ; następnie każdy wiersz X jest punktem. Innymi słowy, sqrt(q(i))*v(i) daje komponent wszystkich punktów.

Te wartości i wektory własne macierzy można łatwo otrzymać w wielu językach programowania (na przykład za pomocą GSL C/C++ za pomocą wbudowanej funkcji eig Matlab, stosując Numpy Python etc.)

Należy zauważyć, że ta konkretna metoda zawsze umieszcza pierwszy punkt w punkcie początkowym, ale wszelkie obracanie, odbicie lub przekształcenie punktów będzie również spełniać oryginalną macierz odległości.

+2

To powinna być odpowiedź. Nie ma potrzeby samodzielnego kodowania, funkcje wielowymiarowego skalowania można znaleźć w Pythonie lub R. –

0

To jest problem matematyczny. Wyprowadzanie macierzy współrzędnych X tylko przez jej macierz odległości.

Istnieje jednak skuteczne rozwiązanie tego problemu - wielowymiarowe skalowanie, które wykonuje pewną algebrę liniową. Mówiąc najprościej, wymaga to macierzy odległości D na poziomie euklidesowym, a wynikiem jest szacowana współrzędna Y (być może obrócona), która jest zbliżeniem do X. Z powodów programowania, po prostu użyj SciKit.manifold.MDS w Pythonie.

Powiązane problemy