2012-06-09 22 views
11

Tengo un conjunto de puntos (con coordenadas desconocidas) y la matriz de distancia. Necesito encontrar las coordenadas de estos puntos para trazarlos y mostrar la solución de mi algoritmo.Encontrar las coordenadas de los puntos de la matriz de distancia

Puedo establecer uno de estos puntos en la coordenada (0,0) para simplificar, y encontrar los demás. ¿Alguien puede decirme si es posible encontrar las coordenadas de los otros puntos, y si es así, cómo?

¡Gracias de antemano!

EDITAR olvidaba decir que tengo las coordenadas en x-y solamente

+0

Eso ... va a necesitar mucha fuerza bruta ... –

+1

Considere tres puntos (un triángulo). Hay dos orientaciones y un número infinito de rotaciones que darían la misma matriz de distancia. –

+0

Un paso más allá, estamos hablando de un espacio unidimensional, o dos, o tres, o cuatro ... La respuesta cambiará en cada caso. Por (0,0), ¿deberíamos aceptar su bidimensional? – Rasman

Respuesta

4

Paso 1, arbitrariamente asignar un punto P1 como (0,0).

Paso 2, asignar arbitrariamente un punto P2 a lo largo del eje x positivo. (0, Dp1p2)

Paso 3, encontrar un punto P3 de tal manera que

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

y establece ese punto de la y de dominio "positivo" (si cumple cualquiera de estos criterios, el punto debe ser colocado en el eje P1P2).
utilizar la ley del coseno para determinar la distancia:

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

Ahora han construido con éxito un espacio ortonormal y se coloca a tres puntos en ese espacio.

Paso 4: Para determinar todos los otros puntos, repita el paso 3, para darle una coordenada y tentativa. (Xn, Yn).
Compara la distancia {(Xn, Yn), (X3, Y3)} a Dp3pn en tu matriz. Si es idéntico, ha identificado con éxito la coordenada para el punto n. De lo contrario, el punto n está en (Xn, -Yn).

en cuenta que es una alternativa al paso 4, pero es demasiado matemática para un sábado por la tarde

+0

@BrunoBruck la ley del coseno proporciona el ángulo (la primera ecuación) entre P1P2 y P1P3. La siguiente parte es obtener la proyección de P3 en el eje P1P2. Conociendo la distancia P1P3, y estableciéndola como la hipotenusa de un triángulo, los valores X e Y son simplemente el cos y el seno multiplicado por la hipotenusa, respectivamente. – Rasman

+0

Lo que hizo con P2 está bien, pero en el caso de P3 no puedo seleccionar un punto de mi conjunto, que no está en la misma línea de P1 y P2, y estoy seguro de que está en el eje y. – Trino00

+0

Ok, creo que lo tengo. Al principio pretendemos que P3 está en el eje y para obtener un triángulo rectángulo, y en tal caso podemos crear las ecuaciones para las coordenadas. Pero sabemos la distancia real entre P3 y P2, por lo que podemos obtener el ángulo real entre P1P2 y P1P3, y usándolo en las ecuaciones para las coordenadas podemos obtener los valores reales para Xp3 e Yp3. ¿Entendí bien? – Trino00

1

Si por puntos p, q, y r tiene PQ, QR, y RP en su matriz, que tiene un triángulo.

Dondequiera que tenga un triángulo en su matriz, puede calcular una de las dos soluciones para ese triángulo (independientemente de una transformación euclidiana del triángulo en el plano). Es decir, para cada triángulo que calcula, su imagen especular también es un triángulo que satisface las restricciones de distancia en p, qy r. El hecho de que haya dos soluciones, incluso para un triángulo, conduce al problema de quiralidad: debe elegir la quiralidad (orientación) de cada triángulo, y no todas las opciones pueden conducir a una solución factible al problema.

Sin embargo, tengo algunas sugerencias. Si las entradas de números son pequeñas, considere usar simulated annealing. Podría incorporar la quiralidad en el paso de recocido. Esto será lento para sistemas grandes, y puede no converger a una solución perfecta, pero para algunos problemas es lo mejor que puedes hacer.

La segunda sugerencia no le dará una solución perfecta, pero distribuirá el error: el method of least squares. En su caso, la función objetivo será el error entre las distancias en su matriz y las distancias reales entre sus puntos.

+0

Gracias por la respuesta. No sé si este es el mejor enfoque porque en algunos cenarios tengo muchos puntos y una metaheurística no siempre devuelve la solución óptima, o en este caso, una solución factible. Así que podría pasar mucho tiempo con él y todavía no obtener una respuesta viable. – Trino00

+0

@DeepYellow: Me gusta su respuesta, en parte, porque puede ayudar a responder una pregunta diferente y más difícil, publicada ayer por un usuario diferente. Traté de responder a esa otra pregunta y fallé. Si el desafío le interesa, aquí está la URL: http://stackoverflow.com/questions/10957359/minimal-rectangle-containing-all-intersections-of-lines – thb

+0

@thb: Gracias por señalar esa pregunta. Publiqué lo que creo que es una solución correcta, déjame saber lo que piensas. –

11

Las respuestas basadas en ángulos son difíciles de implementar y no se pueden generalizar fácilmente a datos en dimensiones superiores.Un mejor enfoque es que se menciona en mis y WimC de respuestas here: dada la matriz de distancia D(i, j), definir

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

que debe ser una matriz semi-definida positiva con rango igual a la dimensión euclidiana mínima k en el que los puntos pueden estar incrustado. Las coordenadas de los puntos pueden ser obtenidos a partir de los vectores propios kv(i) de M correspondientes a valores propios distintos de cero q(i): lugar los vectores sqrt(q(i))*v(i) como columnas en una matriz de Xn x k; entonces cada fila de X es un punto. En otras palabras, sqrt(q(i))*v(i) proporciona el i componente th de todos los puntos.

Los valores propios y los vectores propios de una matriz se pueden obtener fácilmente en la mayoría de los lenguajes de programación (por ejemplo, el uso de GSL en C/C++, utilizando la función incorporada eig en Matlab, utilizando Numpy en Python, etc.)

Tenga en cuenta que este método particular siempre coloca el primer punto en el origen, pero cualquier rotación, reflexión o traducción de los puntos también satisfará la matriz de distancia original.

+2

Esta debería ser la respuesta. Sin embargo, no es necesario codificarlo usted mismo, las funciones de escalamiento multidimensional se pueden encontrar en Python o R. –

0

Esto es un problema de matemáticas. Para derivar la matriz de coordenadas X solo dada por su matriz de distancia.

Sin embargo, hay una solución eficiente para esto - Escalamiento multidimensional, que hace un poco de álgebra lineal. En pocas palabras, requiere una matriz de distancia Euclidiana por pares D, y la salida es la coordenada Y estimada (tal vez rotada), que es una aproximación a X. Por razones de programación, simplemente use SciKit.manifold.MDS en Python.

Cuestiones relacionadas