Cálculo da distância até o k-ésimo vizinho mais próximo para todos os pontos do conjunto


9

Para um aplicativo de aprendizado de máquina, meu grupo precisa calcular a distância euclidiana do ésimo vizinho mais próximo em um conjunto para cada (para entre 5 e cerca de 100 e algumas centenas até alguns milhões). Atualmente, estamos usando a abordagem de força bruta ou a abordagem óbvia com uma árvore kd em , que quando é alto eé relativamente baixo e nunca vence. (Tudo está na memória.)X x ( X Y ) R d d | X | | Y | O ( d | X | | X Y | ) X d | X |kXx(XY)Rdd|X||Y|O(d|X||XY|)Xd|X|

Parece que deve haver uma maneira melhor do que a força bruta - pelo menos uma que aproveite a desigualdade do triângulo, ou talvez com hashes sensíveis à localidade. Uma aproximação razoavelmente apertada também é potencialmente aceitável.

A pesquisa que consegui encontrar parece focar no problema de encontrar o único vizinho mais próximo (ou um que seja aproximadamente o mais próximo). O problema que estou procurando tem outro nome ou existe uma conexão com um problema relacionado no qual não pensei?


2
O kd-trees tira proveito da desigualdade do triângulo. Você já tentou usar outras árvores de particionamento de dados espaciais? Outra coisa que você pode analisar (não sei nada sobre o seu algoritmo de aprendizado de máquina) se os pontos específicos tendem a ter estrutura, o que pode ajudá-lo a encontrar rapidamente hiperplanos e a usá-los em uma árvore semelhante a kd em vez da mediana por divisão de coordenadas com baixo desempenho em altas dimensões.
Ross Snider

@RossSnider obrigado pelas sugestões. E claro, as árvores KD usam a desigualdade do triângulo, mas eu estava pensando em algo que seria mais rápido que a força bruta. :) Que outros tipos de árvores de particionamento de dados espaciais você recomendaria? Da lista da Wikipedia, talvez apenas os vp-trees pareçam aplicáveis, e eles não parecem ser melhores que os kd-trees para a distância euclidiana. E pensarei se há uma maneira melhor específica de problema para definir hiperplanos de separação, mas não nos vem à mente.
Dougal

Acho que esperava que o fato de sabermos que estamos avaliando isso para todo o (assim como outros pontos) permita algum tipo de ajuda no algoritmo. Não tenho certeza se é esse o caso. X
Dougal

o que normalmente é em seus aplicativos? k
Suresh Venkat

11
@SureshVenkat Geralmente usamos um de cerca de 3, às vezes um pouco maior. k
Dougal

Respostas:


10

Aqui está um truque simples que pode ser útil. Considere uma amostra aleatória que escolhe cada ponto com probabilidade 1 / k. É fácil verificar se, com boa probabilidade, exatamente um de seus k vizinhos mais próximos estaria na amostra. Calcule o vizinho mais próximo na amostra. Repita este O (k log n) vezes. Com alta probabilidade, os k pontos mais próximos nos pontos calculados são os k vizinhos mais próximos da sua consulta. Portanto, encontrar o k vizinho mais próximo é equivalente a fazer consultas ao vizinho mais próximo.O ( k log n )O(klogn)O(klogn)

Em resumo, me dê uma estrutura de dados rápida para responder a consultas de vizinhos mais próximos, e eu ficaria feliz em fornecer uma estrutura de dados rápida do k-vizinho mais próximo.


Bom truque. Também deve ser bom reutilizar as amostras para diferentes pontos de consulta, certo? Portanto, para calcular o -vizinho mais próximo de cada ponto do conjunto, preciso construir apenas os tempos estrutura de dados . O ( k log n )kO(klogn)
Dougal

11
Reutilizar as amostras é complicado, porque você exige que uma amostra fixa funcione para QUALQUER consulta (a quantificação é invertida) e, portanto, as probabilidades mudam. A idéia geral seria então construir um conjunto de amostras de tamanho maior (isso depende das #queries) e usá-las, se isso for um problema.
precisa

@SureshVenkat Ah, claro. Vou me sentar e descobrir as probabilidades reais. Obrigado a todos!
Dougal

Se você fizer amostras , cada consulta será bem-sucedida com a probabilidade . Observe que esse truque é um pouco melhor do que parece à primeira vista - você tem amostras , cada uma delas com tamanho (com alta probabilidade se não for muito grande). O que significa melhor tempo de consulta para cada uma das amostras. 1 - δ O ( k log n ) O ( n / k ) kO(klog(1/δ))1δO(klogn)O(n/k)k
Sariel Har-Peled

3

Uma solução aproximada barata usando um "hash sensível à localidade" seria converter cada ponto na sua forma intercalada em bits:

[xxx, aaaa, zzz] -> xyzxyzxyz

depois classifique o radical para pré-processamento.

Escolha seu ponto para consulta e vá pontos em ambas as direções para obter um tamanho de ; então pegue o mais próximo do seu ponto. Veja também este artigo de Connor e Kumar.2 k k t hk2kkth

Veja também este artigo de Callahan e Kosaraju.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.