kompleksitas komputasi k-NN


18

Apa kompleksitas waktu dari algoritma k -NN dengan pendekatan pencarian naif (tidak ada pohon kd atau similars)?

Saya tertarik pada kompleksitas waktunya mempertimbangkan juga hyperparameter k . Saya telah menemukan jawaban yang bertentangan:

  1. O (nd + kn), di mana n adalah kardinalitas set pelatihan dan d dimensi masing-masing sampel. [1]

  2. O (ndk), di mana lagi n adalah kardinalitas set pelatihan dan d dimensi masing-masing sampel. [2]

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

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

Jawaban:


20

Dengan asumsi adalah tetap (seperti yang dilakukan oleh kedua kuliah terkait), maka pilihan algoritmik Anda akan menentukan apakah perhitungan Anda membutuhkan runtime O ( n d + k n ) runtime atau runtime O ( n d k ) .kO(nd+kn)O(ndk)

Pertama, mari kita pertimbangkan algoritma runtime :O(nd+kn)

  • Inisialisasi untuk semua pengamatan saya pada set pelatihanselectedi=0i
  • Untuk setiap pelatihan set observasi , hitung d i s t i , jarak dari observasi baru ke training set observasi iidistii
  • Untuk hingga k : Lewati semua pengamatan set pelatihan, pilih indeks i dengan nilai d i s t i terkecil dan untuk mana s e l e c t e d i = 0 . Pilih pengamatan ini dengan mengatur s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
  • Kembalikan indeks yang dipilih k

Setiap perhitungan jarak membutuhkan runtime , sehingga langkah kedua membutuhkan runtime O ( n d ) . Untuk setiap iterate pada langkah ketiga, kami melakukan pekerjaan O ( n ) dengan mengulang melalui pengamatan set pelatihan, sehingga langkah keseluruhan membutuhkan pekerjaan O ( n k ) . Langkah pertama dan keempat hanya membutuhkan O ( n ) bekerja, jadi kami mendapatkan runtime O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

Sekarang, mari kita pertimbangkan algoritma runtime :O(ndk)

  • Inisialisasi untuk semua pengamatan saya pada set pelatihanselectedi=0i
  • Untuk hingga k : Lewati semua pengamatan set pelatihan dan hitung jarak d antara observasi set pelatihan yang dipilih dan observasi baru. Pilih indeks i dengan nilai d terkecil yang s e l e c t e d i = 0 . Pilih pengamatan ini dengan mengatur s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
  • Kembalikan indeks yang dipilih k

Untuk setiap iterate pada langkah kedua, kita menghitung jarak antara pengamatan baru dan setiap pengamatan pelatihan set, membutuhkan bekerja untuk iterasi dan karena itu O ( n d k ) kerja secara keseluruhan.O(nd)O(ndk)

Perbedaan antara kedua algoritma adalah bahwa yang pertama precomputes dan menyimpan jarak (membutuhkan memori tambahan), sedangkan yang kedua tidak. Namun, mengingat bahwa kita sudah menyimpan seluruh rangkaian pelatihan, membutuhkan memori O ( n d ) , serta vektor s e l e c t e d , membutuhkan penyimpanan O ( n ) , penyimpanan kedua algoritma tersebut asimptotik. sama. Hasilnya, runtime asimptotik yang lebih baik untuk k > 1 membuat algoritma pertama lebih menarik.O(n)O(nd)selectedO(n)k>1

Perlu dicatat bahwa dimungkinkan untuk mendapatkan runtime menggunakan peningkatan algoritmik:O(nd)

  • Untuk setiap pelatihan set observasi , hitung d i s t i , jarak dari observasi baru ke training set observasi iidistii
  • Jalankan algoritma QuickSelect untuk menghitung jarak terkecil di O ( n ) runtimekthO(n)
  • Kembali semua indeks tidak lebih besar dari yang dihitung jarak terkecilkth

Pendekatan ini mengambil keuntungan dari fakta bahwa pendekatan yang efisien ada untuk menemukan nilai terkecil dalam array disortir.kth


1
Jawaban yang bagus dan saya terutama menyukai saran penggunaan quickselect.
usεr11852 mengatakan Reinstate Monic

Satu pertanyaan lagi: untuk opsi ketiga saya percaya bahwa kompleksitas waktu harus O (nd + k), karena Anda masih harus menghitung label paling umum di antara k-tetangga terdekat untuk mengeluarkan prediksi, kan?
Daniel López

knO(nd+k)O(nd)

Terakhir kali saya mengganggu Anda: mencoba menentukan kompleksitas komputasi dari versi k -NN yang saya modifikasi, saya mendapatkan yang berikut: O (nd + nd / p) Di mana menurut definisi n , d dan p adalah bilangan bulat yang lebih besar daripada nol. Bisakah saya menyederhanakannya menjadi O (nd) ?
Daniel López

@Daniel Yes, in that case O(nd) works.
josliber
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.