K-eng yaqin qo‘shnilar (KNN)


ULASHISH

KNN

KNN - bu tasniflash yoki regressiya vazifalari uchun ishlatilishi mumkin bo‘lgan oddiy, boshqariladigan mashinani o‘rganish (ML) algoritmi va shuningdek, yetishmayotgan qiymatlarni hisoblashda tez-tez ishlatiladi. U berilgan ma’lumotlar nuqtasiga eng yaqin kuzatuvlar ma’lumotlar to‘plamidagi eng "o‘xshash" kuzatuvlar ekanligi haqidagi g‘oyaga asoslanadi va shuning uchun biz eng yaqin mavjud nuqtalarning qiymatlari asosida kutilmagan nuqtalarni tasniflashimiz mumkin. K ni tanlab, foydalanuvchi algoritmda foydalanish uchun yaqin atrofdagi kuzatishlar sonini tanlashi mumkin.

Bu yerda biz KNN tasniflash algoritmini qanday amalga oshirishni ko‘rsatamiz va K ning turli qiymatlari natijalarga qanday ta’sir qilishini ko‘rsatamiz.


U qanday ishlaydi?

K - foydalanish uchun eng yaqin qo‘shnilar soni. Tasniflash uchun yangi kuzatuv qaysi classga tegishli ekanligini aniqlash uchun ko‘pchilik ovozdan foydalaniladi. K ning kattaroq qiymatlari ko‘pincha o‘zgarib turadigan qiymatlarga nisbatan mustahkamroq bo‘ladi va juda kichik qiymatlarga qaraganda barqarorroq qaror chegaralarini keltirib chiqaradi (K = 3 K = 1 dan yaxshiroq bo‘ladi, bu esa istalmagan natijalarga olib kelishi mumkin.

Misol

Ba’zi ma’lumotlar nuqtalarini vizualizatsiya qilishdan boshlang:

import matplotlib.pyplot as plt x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12] y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21] classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1] plt.scatter(x, y, c=classes) plt.show()

Natija

Misolni ishga tushirish »

Endi biz KNN algoritmini K=1 bilan moslashtiramiz:

from sklearn.neighbors import KNeighborsClassifier

data = list(zip(x, y))
knn = KNeighborsClassifier(n_neighbors=1)

knn.fit(data, classes)

Va undan yangi ma’lumot nuqtasini tasniflash uchun foydalaning:

Misol

new_x = 8 new_y = 21 new_point = [(new_x, new_y)] prediction = knn.predict(new_point) plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]]) plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}") plt.show()

Natija

Misolni ishga tushirish »

Endi biz xuddi shu narsani qilamiz, lekin prognozni o‘zgartiradigan yuqori K qiymati bilan:

Misol

knn = KNeighborsClassifier(n_neighbors=5) knn.fit(data, classes) prediction = knn.predict(new_point) plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]]) plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}") plt.show()

Natija

Misolni ishga tushirish »


Misol tushuntirildi

Sizga kerak bo‘lgan modullarni import qiling.

Matplotlib moduli haqida bizning "Matplotlib o‘quv qo‘llanmamizdan bilib olishingiz mumkin.

scikit-learn - Python-da mashina o‘rganish uchun mashhur kutubxona.

import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

Ma’lumotlar to‘plamidagi o‘zgaruvchilarga o'xshash massivlarni yarating. Bizda ikkita kiritish xususiyati (x va y) va keyin maqsad class(class) mavjud. Maqsadimizclassbilan oldindan belgilangan kiritish xususiyatlari yangi ma’lumotlarningclassni bashorat qilish uchun ishlatiladi. Shuni yodda tutingki, biz bu yerda faqat ikkita kiritish xususiyatidan foydalansak, bu usul istalgan miqdordagi o‘zgaruvchilar bilan ishlaydi:

x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

Kirish xususiyatlarini nuqtalar to‘plamiga aylantiring:

data = list(zip(x, y))
print(data)

Natija:

[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (8, 22), (10, 21), (12, 21)]

Kirish xususiyatlari va maqsadli sinfdan foydalanib, biz KNN modelini 1 ta eng yaqin qo‘shnidan foydalangan holda modelga moslashtiramiz:

knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data, classes)

Keyin, biz yangi, kutilmagan ma’lumotlar nuqtalari sinfini taxmin qilish uchun bir xil KNN obyektidan foydalanishimiz mumkin. Avval biz yangi x va y xususiyatlarini yaratamiz, so‘ngra 0 yoki 1 sinfini olish uchun yangi ma’lumotlar nuqtasida knn.predict() metodini chaqiramiz:

new_x = 8
new_y = 21
new_point = [(new_x, new_y)]
prediction = knn.predict(new_point)
print(prediction)

Natija:

[0]

Biz barcha ma’lumotlarni yangi nuqta va class bilan birga chizganimizda, u 1-class bilan ko‘k rangda belgilanganligini ko‘rishimiz mumkin. Matn izohi faqat yangi nuqtaning joylashishini ta’kidlash uchundir:

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

Natija:

Biroq, biz qo‘shnilar sonini 5 ga o‘zgartirganimizda, yangi nuqtamizni tasniflash uchun ishlatiladigan ballar soni o‘zgaradi. Natijada, yangi nuqtaning tasnifi ham shunday bo‘ladi:

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(data, classes)
prediction = knn.predict(new_point)
print(prediction)

Natija:

[1]

Yangi nuqta sinfini eski nuqtalar bilan birga chizganimizda, rang tegishli class yorlig‘i asosida o‘zgarganligini ta’kidlaymiz:

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()

Natija:


W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!