Encontrar un número conocido de centros de círculo que maximicen el número de puntos dentro de una distancia fija

10

Tengo un conjunto de datos en 2-D donde quiero encontrar los centros de un número específico de centros de círculos ( ) que maximizan el número total de puntos dentro de una distancia específica ( ).RNR

Por ejemplo, tengo 10,000 puntos de datos y quiero encontrar los centros de círculos que capturan tantos puntos como sea posible dentro de un radio de . Los 5 centros y el radio de 10 se dan de antemano, no se derivan de los datos.N = 5 R = 10(Xi,Yi)N=5R=10

La presencia de un punto de datos dentro de un círculo es una propuesta binaria. Si , no hay diferencia en el valor de un punto a 11 unidades de distancia vs. . Un punto de datos está dentro o fuera de uno de los círculos.R=10

¿Hay algún buen algoritmo que pueda usarse para resolver este problema? Esto parece estar relacionado con las técnicas de agrupamiento, pero en lugar de minimizar la distancia promedio, la función de "distancia" es 0 si el punto está dentro de de cualquiera de los puntos, y 1 en caso contrario.NRN

Preferiría encontrar una manera de hacer esto en R, pero cualquier enfoque sería apreciado.

coronel.triq
fuente
¿Se permite la superposición de círculo?
curious_cat
1
Esto es esencialmente una operación de vecindad (o focal) en un dataset ráster. Sería bueno revisar el sitio SIG para ver si se ha respondido y examinar los paquetes R para realizar análisis Raster.
Andy W
1
Se permite la superposición de círculos, pero los puntos de datos cubiertos por ambos círculos no se contarán dos veces. Gracias por el puntero a la operación de vecindario / focal en datasets ráster. Buscaré algo en ese sentido.
coronel.triq
@Andy W Aunque las operaciones focales estarían naturalmente involucradas en una solución, esta pregunta está más allá de la experiencia de la comunidad SIG, en mi humilde opinión, porque es realmente un problema de optimización (bastante difícil). No es una simple cuadrícula de encontrar el máximo de un foco focal. Recomendaría mantenerlo aquí por un tiempo y luego, si no surge una solución satisfactoria, migrar a un sitio orientado a la programación.
whuber
.... o migrando a math.overflow? También podrían tener algunas ideas sobre esto.
curious_cat

Respuestas:

1

Este es un problema de variación k-medias. El radio de los centros no importa, siempre que se suponga que son iguales.

Enlaces:

Pondrá los centros de los círculos en ubicaciones de mayor probabilidad de los puntos.

Procedimiento clásico de K-medias:

  1. establecer el recuento de clústeres en 5
  2. poner cada punto en un grupo aleatorio
  3. para cada grupo, calcule la posición media
  4. para cada punto, calcule la distancia a cada nueva posición media
  5. asociar membresía con el grupo más cercano
  6. repita hasta que termine (iteraciones, cambio de posición u otra métrica de error)

Opciones:

  • Puede usar un poco de relajación después de 3, donde traslada la posición media lentamente hacia la nueva posición.
  • Este es un sistema discreto, por lo que no converge perfectamente. A veces lo hace y puede terminar cuando los puntos dejan de cambiar la membresía, pero a veces simplemente se mueven un poco.
  • Si está creando su propio código (como debería hacerlo la mayoría de las personas), puede usar el medio POR k anterior como punto de partida y hacer alguna variación en EM informada por el porcentaje de puntos exclusivamente y completamente abarcados por los círculos.

Por qué K-means ataca el problema:

  • Es el equivalente a ajustar un modelo de mezcla gaussiana donde las covarianzas de los componentes son iguales. Los centros de los componentes de la mezcla se ubicarán en las posiciones de mayor expectativa de puntos. Las curvas de probabilidad constante serán círculos. Este es el algoritmo EM, por lo que tiene la convergencia asintótica. Las membresías son duras, no blandas.
  • Creo que si la suposición fundamental del modelo de mezcla de componentes de varianza igual es razonablemente "cercana", sea lo que sea lo que eso signifique, entonces este método va a encajar. Si solo distribuye puntos al azar, es menos probable que se ajuste bien.

Debería haber algún análogo de un "Poisson inflado cero" donde hay un componente que no es gaussiano que recoge la distribución uniforme.

Si desea "ajustar" su modelo y estaba seguro de que había suficientes puntos de muestra, entonces podría inicializar con k-means, y luego hacer un ajustador de k-means aumentado que elimine puntos fuera de los radios de los círculos de la competencia. Perturbaría ligeramente los círculos que tiene, pero podría haber mejorado ligeramente el rendimiento dados los datos.

Estudiante
fuente
¿Podría ser un poco más explícito sobre cómo K-means resuelve este problema?
whuber
Gracias por la sugerencia. ¿Todavía no me queda claro que el enfoque K-means resuelve el problema? Considere el ejemplo de tres grupos de datos normales (0,1) generados, donde los centros están desplazados por 5 unidades más o menos. Los centros de K-medias darían la densidad máxima. Ahora recorte algunos de los puntos con "agujeros" de modo que se eliminen los datos que estén más cerca de 0.5 a los centros. K-means todavía mostrará los mismos centros, pero si está tratando de obtener una cobertura máxima para N = 3, R = 0.5, esa no es la respuesta correcta (porque los agujeros de rosquilla no contienen datos). ¿Estoy malinterpretando algo?
coronel.triq
Buscaré más en tu pregunta para obtener una mejor respuesta cuando tenga tiempo. Me gusta permitir pesos negativos. A veces puede manejar donas de datos, así como polinomios racionales radiales.
EngrStudent
0

Alguien probablemente tenga un mejor algoritmo formal, pero aquí hay un enfoque de fuerza bruta (¿un truco?). Usaría uno de los algoritmos de agrupamiento hexagonal para calcular un histograma 2D. Al igual que hexbinen R.

Usaría un tamaño de hexágono que circunscribiría aproximadamente su círculo de radio R y luego ordenaría en los contenedores superiores de N. Si tienes Ncontenedores distintos muy lejos, genial. Ahora, una forma es moverse alrededor del círculo localmente en una escala R 2 * (en direcciones x e y) desde el centro de los hexágonos de densidad superior. Calcular las densidades puede optimizar aproximadamente la posición localmente. Esto explicará el hecho de que los hexágonos no eran una ventana móvil con respecto a un origen fijo.

Si todos los contenedores superiores están cerca, tendría que tener una forma más inteligente de mover sus círculos en esa vecindad.

Tenga en cuenta que puedo pensar en varios casos de esquina donde una estrategia tan ingenua fracasará espectacularmente. Sin embargo, solo un punto de partida.

Mientras tanto, espero que alguien tenga un mejor algoritmo.

curioso_cat
fuente
1
Algo como esto podría resolver el problema, al menos aproximadamente, para un círculo. (Esto se puede hacer fácilmente usando conteos focales con un SIG). Pero no resolverá el problema de múltiples círculos.
whuber
@whuber: ¿Qué hay de resolver un círculo y luego soltar todos los puntos que se encuentran dentro de ese círculo y luego repetir el algoritmo original? ¿Puedes ver situaciones donde esto fallaría?
curious_cat
Si, facilmente. (El suyo es un "algoritmo codicioso"). Considere el caso en una dimensión con puntos en . Su algoritmo coloca el primer círculo que cubre y el segundo que cubre : ocho puntos en toto . Una solución mejor cubre con un círculo y con otro: nueve puntos. 0 , 1 , 2 , 20 , 21 , 28 , 29 , 30 , 31 , 32 , 39 , 40 28 , 29 , 30 , 31 , 32 0 , 1 , 2R=10,N=20,1,2,20,21,28,29,30,31,32,39,4028,29,30,31,320,1,230 , 31 , 32 ,20,21,28,29,3030,31,32,39,40
whuber
@whuber: Cierto. Tienes razón. Aunque dependiendo de la estructura de los puntos de entrada en algunos (¿muchos?), Las soluciones codiciosas y no codiciosas pueden ser idénticas o cercanas? No lo sé.
curious_cat el
@whuber: El problema parece mayormente en los límites. ¿Qué pasa si (un poco como he mencionado en mi respuesta) uno se mueve la ventana +Ry -Ra continuación, pone todas las soluciones factibles en una pila y seleccionar entre ellos. Por ejemplo, en su 1Dejemplo al golpear 28,29,30,31,32, deslizaría la ventana hasta 18-28y 38-48buscaría todas las soluciones factibles. Luego, dentro de estos, puede buscar combinaciones de rendimiento de punto máximo. ¿No está seguro si eso ayudaría? ¿Estoy tratando de ver si mi ingenuo algoritmo puede salvarse? :)
curious_cat el