Eu tenho um conjunto de dados 2D em que desejo encontrar os centros de um número especificado de centros de círculos ( ) que maximizam o número total de pontos dentro de uma distância especificada ( ).R
por exemplo, eu tenho 10.000 pontos de dados e quero encontrar os centros de círculos que capturam o máximo de pontos possível dentro de um raio de . Os 5 centros e o raio de 10 são dados previamente, não derivados dos dados.N = 5 R = 10
A presença de um ponto de dados dentro de um círculo é uma proposição binária ou / ou. Se , não há diferença de valor para um ponto a 11 unidades de distância vs. 100 unidades de distância, pois ambos são> 10. Da mesma forma, por estar dentro do círculo, não há valor extra em estar perto do centro vs. . Um ponto de dados está em um dos círculos ou sai.
Existe um bom algoritmo que pode ser usado para resolver esse problema? Isso parece relacionado às técnicas de agrupamento, mas, em vez de minimizar a distância média, a função "distance" é 0 se o ponto estiver dentro de de qualquer um dos pontos e 1 caso contrário.N
Minha preferência seria encontrar uma maneira de fazer isso em R, mas qualquer abordagem seria apreciada.
fonte
Respostas:
Este é um problema de variação k-significa. O raio dos centros não importa, desde que sejam assumidos iguais.
Ligações:
Ele colocará os centros dos círculos em locais de maior probabilidade dos pontos.
Procedimento clássico dos meios K:
Opções:
Por que o K-significa ataca o problema:
Deve haver algum análogo de um "Poisson inflado zero" onde haja um componente não gaussiano que capte a distribuição uniforme.
Se você quisesse "ajustar" o seu modelo e estivesse confiante de que havia pontos de amostra suficientes, poderia inicializar com o k-means e, em seguida, fazer um ajustador de k-means aumentado que remove os pontos fora dos raios dos círculos da competição. Isso perturbaria levemente os círculos que você tem, mas pode ter um desempenho ligeiramente melhorado, dados os dados.
fonte
Alguém provavelmente tem um algoritmo formal melhor, mas aqui está uma abordagem de força bruta (um hack?). Eu usaria um dos algoritmos de bin hexagonal para calcular um histograma 2D. Como
hexbin
emR
.Eu usaria um tamanho hexagonal que circunscreveria seu círculo de raio R e depois classificaria nas N caixas superiores. Se você tiver
N
caixas distantes distantes, ótimo. Agora, uma maneira é mover o círculo localmente em uma escala 2 * R (nas direções x e y) do centro dos hexágonos de densidade superior. As densidades computacionais podem otimizar aproximadamente a posição localmente. Isso explica o fato de que os hexágonos não eram uma janela móvel em relação a uma origem fixa.Se todas as caixas principais estiverem próximas, você precisará ter uma maneira mais inteligente de mover seus círculos nessa vizinhança.
Note que posso pensar em vários casos de esquina onde uma estratégia tão ingênua falhará espetacularmente. No entanto, apenas um ponto de partida.
Enquanto isso, espero que alguém tenha um algoritmo melhor.
fonte
+R
e-R
em seguida, coloca todas as soluções viáveis em uma pilha e seleciona entre eles. Por1D
exemplo, no seu exemplo ao bater28,29,30,31,32
, ele deslizaria a janela até18-28
e38-48
procuraria todas as soluções viáveis. Então, dentro desses, pode-se procurar combinações máximas de obtenção de pontos. Não tem certeza se isso ajudaria? Estou tentando ver se meu algoritmo ingênuo pode ser recuperado? :)