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 |
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?
Respostas:
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.
fonte
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 hk 2k kth
Veja também este artigo de Callahan e Kosaraju.
fonte