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 ( ).R
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
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.
¿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.N
Preferiría encontrar una manera de hacer esto en R, pero cualquier enfoque sería apreciado.
fuente
Respuestas:
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:
Opciones:
Por qué K-means ataca el problema:
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.
fuente
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
hexbin
enR
.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
N
contenedores 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.
fuente
+R
y-R
a continuación, pone todas las soluciones factibles en una pila y seleccionar entre ellos. Por ejemplo, en su1D
ejemplo al golpear28,29,30,31,32
, deslizaría la ventana hasta18-28
y38-48
buscarí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? :)