J'ai un ensemble de données 2D où je veux trouver les centres d'un nombre spécifié de centres de cercles ( ) qui maximisent le nombre total de points dans une distance spécifiée ( ).
Par exemple, j'ai 10 000 points de données et je veux trouver les centres de cercles qui capturent autant de points que possible dans un rayon de . Les 5 centres et le rayon de 10 sont donnés à l'avance, non dérivés des données.
La présence d'un point de données dans un cercle est une proposition binaire soit / ou. Si , il n'y a pas de différence de valeur avec un point à 11 unités de distance contre 100 unités de distance, car ils sont tous les deux> 10. De même pour être dans le cercle, il n'y a pas de valeur supplémentaire à être près du centre vs près du bord . Un point de données se trouve dans l'un des cercles ou à l'extérieur.
Existe-t-il un bon algorithme qui peut être utilisé pour résoudre ce problème? Celles-ci semblent liées aux techniques de regroupement, mais plutôt que de minimiser la distance moyenne, la fonction "distance" est 0 si le point est à l'intérieur de de l'un des points, et 1 sinon.
Ma préférence serait de trouver un moyen de le faire en R, mais toute approche serait appréciée.
la source
Réponses:
Il s'agit d'un problème de variation k-means. Le rayon des centres n'a pas d'importance, tant qu'ils sont supposés égaux.
Liens:
Il placera les centres des cercles aux endroits où la probabilité des points est la plus élevée.
Procédure classique K-means:
Options:
Pourquoi K-means attaque le problème:
Il devrait y avoir un analogue d'un «Poisson gonflé zéro» où il y a une composante non gaussienne qui capte la distribution uniforme.
Si vous vouliez "ajuster" votre modèle et que vous étiez convaincu qu'il y avait suffisamment de points d'échantillonnage, vous pouviez initialiser avec les k-moyennes, puis faire un ajusteur augmenté des k-moyennes qui supprimait les points en dehors des rayons des cercles de la compétition. Cela perturberait légèrement les cercles que vous avez, mais cela pourrait avoir des performances légèrement améliorées compte tenu des données.
la source
Quelqu'un a probablement un meilleur algorithme formel, mais voici une approche par force brute (un hack?). J'utiliserais l'un des algorithmes de binning hexagonaux pour calculer un histogramme 2D. Comme
hexbin
dansR
.J'utiliserais une taille hexagonale qui circonscrirait grossièrement votre cercle de rayon R, puis trier sur les N bacs supérieurs. Si vous avez
N
des bacs éloignés distincts, tant mieux. Maintenant, une façon consiste à se déplacer sur le cercle localement sur une échelle 2 * R (dans les directions x et y) à partir du centre des hexagones de densité supérieure. Les densités de calcul peuvent à peu près optimiser la position localement. Cela expliquera le fait que les hexagones n'étaient pas une fenêtre mobile par rapport à une origine fixe.Si tous les bacs supérieurs sont à proximité, vous devriez avoir une façon plus intelligente de déplacer vos cercles dans ce voisinage.
Notez que je peux penser à plusieurs cas de coin où une telle stratégie naïve échouera de manière spectaculaire. Pourtant, juste un point de départ.
En attendant, j'espère que quelqu'un a un meilleur algorithme.
la source
+R
et-R
et met ensuite toutes les solutions possibles sur une pile et sélectionne parmi eux. Par exemple, dans votre1D
exemple de frappe, vous faites28,29,30,31,32
glisser la fenêtre jusqu'à ce18-28
que vous38-48
recherchiez toutes les solutions possibles. Ensuite, à l'intérieur de celles-ci, on peut rechercher des combinaisons de rendement maximal. Vous ne savez pas si cela pourrait vous aider? J'essaie de voir si mon algorithme naïf peut être récupéré? :)