الگوریتم KNN در پایتون
k-نزدیکترین همسایگی (k-Nearest Neighbors) یک روش ناپارامتری است که در دادهکاوی، یادگیری ماشین و تشخیص الگو مورد استفاده قرار میگیرد.
الگوریتم KNN در پایتون
یکی از دلایل اصلی پرکاربرد بودن الگوریتمهای طبقهبندی (Classification) آن است که «تصمیمگیری» یکی از چالشهای اساسی موجود در اغلب پروژههای تحلیلی است. برای مثال، تصمیمگیری درباره اینکه آیا مشتری X پتانسیل لازم برای مورد هدف قرار داده شدن در کارزارهای دیجیتال یک کسبوکار را دارد یا خیر و یا اینکه آیا یک مشتری وفادار است یا نه از جمله مسائل تصمیمگیری به حساب میآیند که در فرآیند تحلیل قصد پاسخدهی به آنها وجود دارد. نتایج این تحلیلها بسیار تأملبرانگیز هستند و بهطور مستقیم به پیادهسازی نقشه راه در یک سازمان یا کسبوکار کمک میکنند. در این نوشتار، به یکی از روشهای پرکاربرد طبقهبندی، یعنی روش k-نزدیکترین همسایگی پرداخته شده و تمرکز آن بر چگونگی کار کردن الگوریتم و تأثیر پارامترهای ورودی بر خروجی و پیشبینی است.
شبه کد k-نزدیکترین همسایگی
پیادهسازی مدل k-نزدیکترین همسایگی با استفاده از شبه کد زیر امکانپذیر است:
- بارگذاری دادهها.
- انتخاب اولیه مقدار k.
- برای ایجاد کلاسهای پیشبینی، از مقدار ۱ تا تعداد کل نقاط داده آموزش تکرار شود:
- فاصله دادههای تست از هر سطر مجموعه داده آموزش محاسبه میشود. در اینجا از فاصله اقلیدسی به عنوان فاصله سنجش استفاده میشود که مرسومترین روش است و دیگر سنجههای قابل استفاده عبارتاند از فاصله چبیشف، کسینوس و دیگر موارد.
- فاصلههای محاسبه شده بر اساس مقدار فاصله بهصورت صعودی مرتب شودند.
- سطرهای k بالایی از آرایه مرتب شده انتخاب شود.
- کلاسهای دارای بیشترین تکرار در این سطرها دریافت شود.
- مقدار کلاس پیشبینیشده بازگردانده شود.
کدنویسی الگوریتم KNN در پایتون
از مجموعه داده معروف Iris برای ساخت مدل KNN استفاده شده است.
# Importing libraries
import pandas as pd
import numpy as np
import math
import operator
# Importing data
data = pd.read_csv("iris.csv")
#### End of STEP 1
data.head()

# Defining a function which calculates euclidean distance between two data points
def euclideanDistance(data1, data2, length):
distance = 0
for x in range(length):
distance += np.square(data1[x] - data2[x])
return np.sqrt(distance)
# Defining our KNN model
def knn(trainingSet, testInstance, k):
distances = {}
sort = {}
length = testInstance.shape[1]
#### Start of STEP 3
# Calculating euclidean distance between each row of training data and test data
for x in range(len(trainingSet)):
#### Start of STEP 3.1
dist = euclideanDistance(testInstance, trainingSet.iloc[x], length)
distances[x] = dist[0]
#### End of STEP 3.1
#### Start of STEP 3.2
# Sorting them on the basis of distance
sorted_d = sorted(distances.items(), key=operator.itemgetter(1))
#### End of STEP 3.2
neighbors = []
#### Start of STEP 3.3
# Extracting top k neighbors
for x in range(k):
neighbors.append(sorted_d[x][0])
#### End of STEP 3.3
classVotes = {}
#### Start of STEP 3.4
# Calculating the most freq class in the neighbors
for x in range(len(neighbors)):
response = trainingSet.iloc[neighbors[x]][-1]
if response in classVotes:
classVotes[response] += 1
else:
classVotes[response] = 1
#### End of STEP 3.4
#### Start of STEP 3.5
sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)
return(sortedVotes[0][0], neighbors)
#### End of STEP 3.5
# Creating a dummy testset
testSet = [[7.2, 3.6, 5.1, 2.5]]
test = pd.DataFrame(testSet)
#### Start of STEP 2
# Setting number of neighbors = 1
k = 1
#### End of STEP 2
# Running KNN model
result,neigh = knn(data, test, k)
# Predicted class
print(result)
-> Iris-virginica
# Nearest neighbor
print(neigh)
-> [141]
حالا با جایگزینی مقدار K میتوانیم تغییرات جدید را ببنیم:
# Setting number of neighbors = 3 k = 3 # Running KNN model result,neigh = knn(data, test, k) # Predicted class print(result) -> Iris-virginica # 3 nearest neighbors print(neigh) -> [141, 139, 120] # Setting number of neighbors = 5 k = 5 # Running KNN model result,neigh = knn(data, test, k) # Predicted class print(result) -> Iris-virginica # 5 nearest neighbors print(neigh) -> [141, 139, 120, 145, 144]
نظرات خود را در ارتباط با مقالهی آموزشی “کار با الگوریتم k-Nearest Neighbors با پایتون” را بنویسید. در ارتباط با شاخههای مختلف هوش مصنوعی در این لینک بیشتر بخوانید.



















تفاوت عملکرد KNN در حالت Classification و Regression چیه؟
در حالت Classification، KNN بر اساس برچسب همسایههای نزدیک، کلاس نمونه جدید رو با رأیگیری اکثریت مشخص میکنه.
در حالت Regression، به جای کلاس، میانگین (یا میانگین وزنی) مقادیر خروجی همسایهها محاسبه میشه.
زمان اجرای KNN برای دیتاست بزرگ چطور بهینه میشه؟
با استفاده از ساختارهای دادهای مثل KD-Tree یا Ball Tree، کاهش ابعاد با PCA و همچنین کاهش اندازه دیتاست با نمونهبرداری میشه سرعت جستجو رو زیاد کرد.
در دادههای نامتوازن، آیا KNN دچار bias میشه؟
بله، چون کلاس پرتعداد همسایههای بیشتری داره و رأی اکثریت رو میگیره. راهکار: استفاده از وزندهی معکوس نسبت به فاصله یا تکنیکهای بالانسسازی داده مثل SMOTE.
تاثیر نویز در دادهها روی عملکرد KNN چقدر هست و چطور میشه کاهش داد؟
KNN به نویز حساسه چون هر نمونه نویزی میتونه روی برچسب همسایهها اثر بزاره. برای کاهش: پاکسازی داده، انتخاب K بزرگتر، و استفاده از وزندهی فاصلهای مؤثره.
آیا حذف ویژگیهای غیرمرتبط میتونه دقت مدل رو بالا ببره؟
بله، حذف ویژگیهای بیاثر یا پر از نویز باعث میشه فاصلهها دقیقتر محاسبه بشن و مدل بهتری ساخته بشه.