ความซับซ้อนในการคำนวณ k-NN


18

ความซับซ้อนของเวลาของอัลกอริทึมk -NN ด้วยวิธีการค้นหาแบบไร้เดียงสา (ไม่มี kd tree หรือ similars) คืออะไร?

ผมสนใจในความซับซ้อนเวลาพิจารณายัง hyperparameter k ฉันได้พบคำตอบที่ขัดแย้ง:

  1. O (ND + kn) โดยที่nคือ cardinality ของชุดการฝึกอบรมและวันที่มิติของแต่ละตัวอย่าง [1]

  2. O (ndk) อีกครั้งที่nเป็น cardinality ของชุดการฝึกอบรมและวันที่มิติของแต่ละตัวอย่าง [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 (หน้า 18/31)

คำตอบ:


20

สมมติว่าได้รับการแก้ไข (เป็นทั้งการบรรยายที่เชื่อมโยงกัน) จากนั้นตัวเลือกขั้นตอนวิธีของคุณจะกำหนดว่าการคำนวณของคุณใช้เวลารันไทม์O ( n d + k n )หรือO ( n d kkO(nd+kn)รันไทม์O(ndk)

อันดับแรกให้พิจารณาO(nd+kn)อัลกอริทึมรันไทม์ :

  • เตรียมสำหรับการสังเกตทั้งหมดฉันอยู่ในชุดฝึกอบรมselectedi=0i
  • สำหรับการฝึกอบรมในแต่ละชุดการสังเกตคำนวณd ฉันs T ฉัน , ระยะทางจากการสังเกตใหม่เพื่อการฝึกอบรมชุดสังเกตฉันidistii
  • สำหรับจะk : ห่วงผ่านทุกการสังเกตการฝึกอบรมชุดเลือกดัชนีฉันมีขนาดเล็กที่สุดd ฉันs T ฉันคุ้มค่าและการที่s อีลิตรอีทีอีd ฉัน = 0 เลือกข้อสังเกตนี้โดยการตั้งค่าของอีลิตรอีทีอีd ฉัน = 1j=1kidistiselectedi=0selectedi=1
  • ส่งคืนดัชนีที่เลือกk

การคำนวณระยะทางแต่ละครั้งต้องใช้รันไทม์ดังนั้นขั้นตอนที่สองต้องใช้รันไทม์O ( n d ) สำหรับแต่ละย้ำในขั้นตอนที่สามเราดำเนินการO ( n )การทำงานโดยการวนลูปผ่านการสังเกตการฝึกอบรมชุดดังนั้นขั้นตอนโดยรวมต้องO ( n k )การทำงาน ขั้นตอนแรกและขั้นตอนที่สี่จำเป็นต้องใช้งานO ( n )เท่านั้นดังนั้นเราจึงได้O ( n d + k n )รันไทม์O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

Now, let's consider a O(ndk) runtime algorithm:

  • Initialize selectedi=0 for all observations i in the training set
  • For j=1 to k: Loop through all training set observations and compute the distance d between the selected training set observation and the new observation. Select the index i with the smallest d value for which selectedi=0. Select this observation by setting selectedi=1.
  • Return the k selected indices

O(nd)O(ndk)

O(n)O(nd)selected vector, requiring O(n) storage, the storage of the two algorithms is asymptotically the same. As a result, the better asymptotic runtime for k>1 makes the first algorithm more attractive.

It's worth noting that it is possible to obtain an O(nd) runtime using an algorithmic improvement:

  • For each training set observation i, compute disti, the distance from the new observation to training set observation i
  • Run the quickselect algorithm to compute the kth smallest distance in O(n) runtime
  • Return all indices no larger than the computed kth smallest distance

This approach takes advantage of the fact that efficient approaches exist to find the kth smallest value in an unsorted array.


1
Great answer and I especially like the advice towards the use of quickselect.
usεr11852 says Reinstate Monic

One more question: for the third option I believe that the time complexity should be O(nd+k), as you still have to compute the most common label among the k-nearest neighbors to emit a prediction, right?
Daniel López

@Daniel Since kn, O(nd+k) is the same as 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.