k-NN complessità computazionale


18

Qual è la complessità temporale dell'algoritmo k -NN con approccio di ricerca ingenuo (nessun albero kd o simili)?

Sono interessato alla sua complessità temporale considerando anche l'iperparametro k . Ho trovato risposte contraddittorie:

  1. O (nd + kn), dove n è la cardinalità dell'insieme formazione e d la dimensione di ogni campione. [1]

  2. O (NDK), dove ancora una volta n è la cardinalità dell'insieme formazione e d la dimensione di ogni campione. [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)

Risposte:


20

Supponendo che sia fisso (come fanno entrambe le lezioni collegate), le tue scelte algoritmiche determineranno se il tuo calcolo richiede runtime O ( n d + k n ) o runtime O ( n d k ) .kO(nd+kn)O(ndk)

Innanzitutto, consideriamo un algoritmo di runtime :O(nd+kn)

  • Inizializza per tutte le osservazioni i nel set di addestramentoselectedi=0i
  • Per ogni osservazione del set di allenamento , calcolare d i s t i , la distanza dalla nuova osservazione all'osservazione del set di allenamento iidistii
  • Per a k : scorrere tutte le osservazioni del set di allenamento, selezionando l'indice i con il valore d i s t i più piccolo e per il quale s e l e c t e d i = 0 . Seleziona questa osservazione impostando s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
  • Restituisce i indici selezionatik

Ogni calcolo della distanza richiede il runtime , quindi il secondo passo richiede il runtime O ( n d ) . Per ogni iterazione nel terzo passaggio, eseguiamo il lavoro O ( n ) eseguendo il ciclo attraverso le osservazioni del set di addestramento, quindi il passaggio richiede in generale il lavoro O ( n k ) . Il primo e il quarto passaggio richiedono solo il lavoro O ( n ) , quindi otteniamo un runtime O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

Consideriamo ora un algoritmo di runtime :O(ndk)

  • Inizializza per tutte le osservazioni i nel set di addestramentoselectedi=0i
  • Per a k : scorrere tutte le osservazioni del set di allenamento e calcolare la distanza d tra l'osservazione del set di allenamento selezionata e la nuova osservazione. Seleziona l'indice i con il valore d più piccolo per il quale s e l e c t e d i = 0 . Seleziona questa osservazione impostando s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
  • Restituisce i indici selezionatik

Per ogni iterazione nella seconda fase, calcoliamo la distanza tra la nuova osservazione e ciascuna osservazione del set di addestramento, richiedendo lavoro per un'iterazione e quindi O ( n d k ) nel complesso.O(nd)O(ndk)

La differenza tra i due algoritmi è che il primo precompute e memorizza le distanze (richiedendo memoria aggiuntiva), mentre il secondo no. Tuttavia, dato che memorizziamo già l'intero set di training, richiedendo memoria O ( n d ) , nonché il vettore s e l e c t e d , che richiede archiviazione O ( n ) , la memorizzazione dei due algoritmi è asintoticamente il stesso. Di conseguenza, il miglior tempo di esecuzione asintotico per k > 1 rende il primo algoritmo più attraente.O(n)O(nd)selectedO(n)k>1

Vale la pena notare che è possibile ottenere un runtime usando un miglioramento algoritmico:O(nd)

  • Per ogni osservazione del set di allenamento , calcolare d i s t i , la distanza dalla nuova osservazione all'osservazione del set di allenamento iidistii
  • Eseguire l' algoritmo di QuickSelect per calcolare la più piccola distanza in O ( n ) runtimekthO(n)
  • Restituire tutti gli indici di dimensioni non superiori alla calcolata piccola distanzakth

Questo approccio sfrutta il fatto che gli approcci efficaci esistono per trovare il valore più piccolo in un array non ordinato.kth


1
Ottima risposta e mi piace soprattutto il consiglio per l'uso di quickselect.
usεr11852 dice Reinstate Monic il

Un'altra domanda: per la terza opzione credo che la complessità del tempo dovrebbe essere O (nd + k), dato che devi ancora calcolare l'etichetta più comune tra i vicini k-più vicini per emettere una previsione, giusto?
Daniel López,

@Daniel Since Kn, O(nd+K) equivale a O(nd).
josliber,

Last time I bother you: trying to determine the computational complexity of a modified version of k-NN I am working on, I get the following: O(nd+nd/p) Where by definition n, d and p are integers greater than zero. Can I simplify that to O(nd)?
Daniel López

@Daniel Yes, in that case O(nd) works.
josliber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.