k-NN Rechenkomplexität

17

Was ist die zeitliche Komplexität des k -NN-Algorithmus mit naivem Suchansatz (kein kd-Baum oder ähnliches)?

Mich interessiert die zeitliche Komplexität auch unter Berücksichtigung des Hyperparameters k . Ich habe widersprüchliche Antworten gefunden:

  1. O (nd + kn), wobei n die Kardinalität des Trainingssatzes und d die Dimension jeder Stichprobe ist. [1]

  2. O (ndk), wobei wiederum n die Kardinalität des Trainingssatzes und d die Dimension jeder Stichprobe ist. [2]

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

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

Daniel López
quelle

Antworten:

20

Angenommen, ist fest (wie in beiden verknüpften Vorlesungen), dann bestimmen Ihre algorithmischen Entscheidungen, ob Ihre Berechnung Laufzeit oder Laufzeit benötigt.O ( n d + k n ) O ( n d k )kO(nd+kn)O(ndk)

Betrachten wir zunächst einen -Laufzeitalgorithmus:O(nd+kn)

  • Initialisieren Sie für alle Beobachtungen im Trainingssatziselectedich=0ich
  • Für jeden Trainingssatz Beobachtung , berechnet , der Abstand von der neuen Beobachtung Trainingssatz Beobachtungd i s t i iichdichstichich
  • Für bis : Durchlaufen Sie alle Trainingssatzbeobachtungen, indem Sie den Index mit dem kleinsten Wert , für den . Wählen Sie diese Beobachtung aus, indem Sie .k i d i s t i s e l e c t e d i = 0 s e l e c t e d i = 1j=1kichdichstichselectedich=0selectedich=1
  • Gibt die ausgewählten Indizes zurückk

Für jede Entfernungsberechnung ist eine -Laufzeit erforderlich , sodass für den zweiten Schritt eine -Laufzeit erforderlich ist . Für jede Iteration im dritten Schritt führen wir -Arbeit durch, indem wir die Beobachtungen des Trainingssatzes durchlaufen, sodass für den gesamten Schritt erforderlich ist . Der erste und vierte Schritt erfordern nur Arbeit, sodass wir eine Laufzeit erhalten.O ( n d ) O ( n ) O ( n k ) O ( n ) O ( n d + k n )Ö(d)Ö(nd)Ö(n)Ö(nk)Ö(n)Ö(nd+kn)

Betrachten wir nun einen -Laufzeitalgorithmus:Ö(ndk)

  • Initialisieren Sie für alle Beobachtungen im Trainingssatziselectedich=0ich
  • Für bis : Durchlaufen Sie alle Trainingssatzbeobachtungen und berechnen Sie den Abstand zwischen der ausgewählten Trainingssatzbeobachtung und der neuen Beobachtung. Wählen Sie den Index mit dem kleinsten Wert, für den . Wählen Sie diese Beobachtung aus, indem Sie .k d i d s e l e c t e d i = 0 s e l e c t e d i = 1j=1kdichdselectedich=0selectedich=1
  • Gibt die ausgewählten Indizes zurückk

Für jede Iteration im zweiten Schritt berechnen wir den Abstand zwischen der neuen Beobachtung und jeder Beobachtung des Trainingssatzes, wobei für eine Iteration und damit insgesamt .O ( n d k )Ö(nd)Ö(ndk)

Der Unterschied zwischen den beiden Algorithmen besteht darin, dass der erste die Entfernungen vorberechnet und speichert (was zusätzlichen Speicher erfordert ), während der zweite dies nicht tut. Da wir jedoch bereits den gesamten Trainingssatz speichern, der -Speicher erfordert , sowie den Vektor, der -Speicher erfordert , ist die Speicherung der beiden Algorithmen asymptotisch gleich. Infolgedessen macht die bessere asymptotische Laufzeit für den ersten Algorithmus attraktiver.O ( n d ) s e l e c t e d O ( n ) k > 1Ö(n)Ö(nd)selectedÖ(n)k>1

Es ist erwähnenswert, dass es mit einer algorithmischen Verbesserung möglich ist, eine -Runtime zu erhalten :Ö(nd)

  • Für jeden Trainingssatz Beobachtung , berechnet , der Abstand von der neuen Beobachtung Trainingssatz Beobachtungd i s t i iichdichstichich
  • Führen Sie den Quickselect-Algorithmus aus , um die kleinste Distanz in -Laufzeit zu berechnen O ( n )kthÖ(n)
  • Gibt alle Indizes zurück, die nicht größer als der berechnete kleinste Abstand sindkth

Dieser Ansatz nutzt die Tatsache , dass eine effiziente Ansätze existieren , um die zu finden kleinsten Wert in einer unsortierten Array.kth

josliber
quelle
1
Tolle Antwort und mir gefällt vor allem der Rat zur Verwendung von quickselect.
usεr11852 sagt Reinstate Monic
Eine weitere Frage: Für die dritte Option sollte die Zeitkomplexität meines Erachtens O (nd + k) sein, da Sie immer noch die häufigste Bezeichnung unter den k-nächsten Nachbarn berechnen müssen, um eine Vorhersage abzugeben, oder?
Daniel López
@Daniel Da , ist dasselbe wie . O ( n d + k ) O ( n d )knÖ(nd+k)Ö(nd)
Josefi
Als ich Sie das letzte Mal gestört habe: Wenn ich versuche, die Rechenkomplexität einer modifizierten Version von k -NN zu bestimmen, an der ich arbeite, erhalte ich Folgendes: O (nd + nd / p) Wobei n , d und p per Definition ganze Zahlen sind, die größer sind als Null. Kann ich das für O (nd) vereinfachen ?
Daniel López
@ Daniel Ja, in diesem Fall funktioniert . Ö(nd)
Josliber