Поиск координат точек по матрице расстояний
У меня есть набор точек (с неизвестными координатами) и матрица расстояний. Мне нужно найти координаты этих точек, чтобы построить их и показать решение моего алгоритма.
Я могу установить одну из этих точек в координате (0,0) для упрощения и найти другие. Может ли кто-нибудь сказать мне, можно ли найти координаты других точек, и если да, то как?
спасибо заранее!
изменить Забыл сказать, что мне нужны координаты только на x-y
4 ответов
Шаг 1, произвольно назначьте одну точку P1 как (0,0).
Шаг 2, произвольно назначьте одну точку P2 вдоль положительной оси x. (0, Dp1p2)
Шаг 3, Найдите точку P3 такую, что
Dp1p2 ~= Dp1p3+Dp2p3
Dp1p3 ~= Dp1p2+Dp2p3
Dp2p3 ~= Dp1p3+Dp1p2
и установите эту точку в" положительной " области y (если она соответствует любому из этих критериев, точка должна быть размещена на оси P1P2).
Используйте закон Косинуса, чтобы определить расстояние:
cos (A) = (Dp1p2^2 + Dp1p3^2 - Dp2p3^2)/(2*Dp1p2* Dp1p3)
P3 = (Dp1p3 * cos (A), Dp1p3 * sin(A))
теперь вы успешно построили ортонормированное пространство и поместил три точки в это пространство.
Шаг 4: чтобы определить все остальные точки, повторите шаг 3, чтобы дать вам предварительную координату Y.
(Xn, Yn).
Сравните расстояние {(Xn, Yn), (X3, Y3)} с Dp3pn в вашей матрице. Если он идентичен, вы успешно определили координату для точки n. В противном случае точка n находится в (Xn, -Yn).
Примечание существует альтернатива шагу 4, но это слишком много математики для субботнего дня
ответы, основанные на углах, громоздки для реализации и не могут быть легко обобщены на данные в более высоких измерениях. Лучший подход-это то, что упоминается в моих ответах и ответах WimC здесь: учитывая матрицу расстояний D(i, j)
, определить
M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2)
которая должна быть положительной полуопределенной матрицей с рангом, равным минимальной евклидовой размерности k
в котором точки могут быть встроены. Координаты точек могут быть получены из k
векторов v(i)
of M
соответствует ненулевым собственным значениям q(i)
: место векторов sqrt(q(i))*v(i)
в качестве столбцов в элементе n x k
матрица X
; затем каждый ряд X
точка. Другими словами,sqrt(q(i))*v(i)
дает i
- й компонент всех точек.
собственные значения и собственные векторы матрицы можно легко получить в большинстве языков программирования (например, используя GSL в C/C++, используя встроенную функцию eig
в Matlab, используя Numpy в Python, так далее.)
обратите внимание, что этот конкретный метод всегда помещает первую точку в начало координат, но любое вращение, отражение или перемещение точек также будет удовлетворять исходной матрице расстояний.
Если для точек p, q и r у вас есть PQ, qr и rp в вашей матрице, у вас есть треугольник.
везде, где у вас есть треугольник в вашей матрице, вы можете вычислить одно из двух решений для этого треугольника (независимо от евклидова преобразования треугольника на плоскости). То есть для каждого вычисляемого треугольника зеркальное изображение также является треугольником, удовлетворяющим ограничениям расстояния на p, q и r. Тот факт, что даже для треугольника существует два решения, приводит к хиральности проблема: вы должны выбрать хиральность (ориентации) каждого треугольника, и не все варианты могут привести к возможному решению проблемы.
тем не менее, у меня есть некоторые предложения. Если количество записей мало, рассмотрите возможность использования имитация отжига. Вы можете включить хиральность в этап отжига. Это будет медленно для больших систем, и это может не сходиться к идеальному решению, но для некоторых проблем это лучшее, что вы и делаете.
в второе предложение не даст вам идеального решения, но оно распространит ошибку:метод наименьших квадратов. В вашем случае целевой функцией будет ошибка между расстояниями в вашей матрице и фактическими расстояниями между вашими точками.
это математическая задача. Получить координатную матрицу X, заданную только ее матрицей расстояний.
однако существует эффективное решение этого-многомерное масштабирование, которое делает некоторую линейную алгебру. Проще говоря, для этого требуется попарная евклидова матрица расстояний D, а выход-оценочная координата Y (возможно, повернутая), которая является проксимацией к X. По причине программирования просто используйте SciKit.многообразие.MDS в Python.