complexidade computacional k-NN

18

Qual é a complexidade de tempo do algoritmo k -NN com abordagem de pesquisa ingênua (sem árvore kd ou similar)?

Estou interessado em sua complexidade de tempo, considerando também o hiperparâmetro k . Eu encontrei respostas contraditórias:

  1. O (nd + kn), onde n é a cardinalidade do conjunto de treinamento ed a dimensão de cada amostra. [1]

  2. O (ndk), onde novamente n é a cardinalidade do conjunto de treinamento ed da dimensão de cada amostra. [2]

[1] http://www.csd.uwo.ca/courses/CS9840a/Lecture2_knn.pdf (pag. 18/20).

[2] http://www.cs.haifa.ac.il/~rita/ml_course/lectures/KNN.pdf (pag. 18/31).

Daniel López
fonte

Respostas:

20

Supondo que seja fixo (como as duas palestras vinculadas), suas escolhas algorítmicas determinarão se sua computação leva tempo de execução O ( n d + k n ) ou tempo de execução O ( n d k ) .kO(nd+kn)O(ndk)

Primeiro, vamos considerar um algoritmo de tempo de execução :O(nd+kn)

  • Inicialize para todas as observações i no conjunto de treinamentoselectedi=0i
  • Para cada observação conjunto de treinamento , compute d i s t i , a distância entre a nova observação de conjunto de treinamento de observação iidistii
  • Para a k : Faça um loop em todas as observações do conjunto de treinamento, selecionando o índice i com o menor valor d i s t i e para o qual s e l e c t e d i = 0 . Selecione esta observação definindo s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
  • Retornar os índices selecionadosk

Cada cálculo da distância requer tempo de execução, de modo que o segundo passo requer S ( n d ) tempo de execução. Para cada iteração no terceiro passo, realizamos S ( n ) de trabalho por ciclo através das observações do conjunto de treino, de modo que o passo requer geral S ( n k ) de trabalho. As primeira e quarta etapas requerem apenas trabalho O ( n ) , portanto, obtemos um tempo de execução O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

Agora, vamos considerar um runtime algoritmo:O(ndk)

  • Inicialize para todas as observações i no conjunto de treinamentoselectedi=0i
  • Para a k : Faça um loop em todas as observações do conjunto de treinamento e calcule a distância d entre a observação do conjunto de treinamento selecionado e a nova observação. Seleccionar o índice i com a menor d valor para o qual s e l e c t e d i = 0 . Selecione esta observação definindo s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
  • Retornar os índices selecionadosk

Para cada iteração na segunda etapa, calculamos a distância entre a nova observação e cada observação do conjunto de treinamento, exigindo que trabalhe para uma iteração e, portanto, O ( n d k ) trabalhe em geral.O(nd)O(ndk)

A diferença entre os dois algoritmos é que o primeiro precomputa e armazena as distâncias (exigindo memória extra), enquanto o segundo não. No entanto, dado que já armazenar todo o conjunto de treino, exigindo S ( n d ) de memória, bem como o s e l e c t e d vetor, exigindo S ( n ) de armazenamento, o armazenamento dos dois algoritmos é assintoticamente o mesmo. Como resultado, o melhor tempo de execução assintótico para k > 1 torna o primeiro algoritmo mais atraente.O(n)O(nd)selectedO(n)k>1

Vale ressaltar que é possível obter um tempo de execução usando uma melhoria algorítmica:O(nd)

  • Para cada observação conjunto de treinamento , compute d i s t i , a distância entre a nova observação de conjunto de treinamento de observação iidistii
  • Executar o algoritmo QuickSelect para calcular o menor distância em S ( n ) de tempo de execuçãokthO(n)
  • Retorna todos os índices não maiores que a menor distância calculada kth

Esta abordagem tira vantagem do fato de que as abordagens eficientes existem para encontrar o menor valor em uma matriz indiferenciados.kth

josliber
fonte
1
Ótima resposta e eu particularmente gosto dos conselhos para o uso de quickselect.
usεr11852 diz Reinstate Monic
Mais uma pergunta: para a terceira opção, acredito que a complexidade do tempo deve ser O (nd + k), pois você ainda precisa calcular o rótulo mais comum entre os vizinhos k-mais próximos para emitir uma previsão, certo?
Daniel López
@ Daniel Como , O ( n d + k ) é igual a O ( n d ) . knO(nd+k)O(nd)
josliber
A última vez que o incomodei: tentando determinar a complexidade computacional de uma versão modificada de k -NN em que estou trabalhando, obtenho o seguinte: O (nd + nd / p) Onde, por definição , n , d e p são números inteiros maiores que zero. Posso simplificar isso para O (nd) ?
Daniel López
O(nd)