K-най-близките съседи е контролиран алгоритъм за машинно обучение. Използва се както за класификация, така и за регресия. Той прогнозира изхода въз основа на k-близките точки от данни. В този алгоритъм ние не се учим от набора за обучение, вместо това използваме целия набор за обучение, за да предскажем изхода за нова точка от данни.

Нека вземем пример за класификация, където имаме два класа A и B. За да предвидим класа на нова точка (показана в червено), разглеждаме нейните k-най-близки съседи. Ако k = 3, от трите най-близки точки от данни, 2 точки принадлежат към клас B и 1 точка принадлежи към A. Така че можем да кажем, че новата точка от данни принадлежи към клас B.

За регресия прогнозираме непрекъснатата изходна стойност чрез изчисляване на средната стойност или медианата на k-близките точки от данни.

Разстоянието между две точки може да се изчисли с помощта на Евклидово разстояние, разстояние Манхатън, разстояние на Хеминг или разстояние Минковски.

Подготовка на данни за KNN

  1. Мащабирането на функциие необходимо, тъй като тук намираме разстоянието. Така че функциите в различни мащаби ще имат различен ефект върху изхода.
  2. Не трябва да има липсащи стойности, тъй като не можем да намерим точка с данни с липсваща функция.
  3. KNN не работи добре, ако има много функции. Така че трябва да се използват техники за намаляване на размерите.

Нека да разгледаме реализацията на Python от нулата. Тук няма да използваме библиотека като sklearn.

Импортиране на необходимите библиотеки

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Зареждане на набора от данни

Ще използваме набор от данни за ириса от библиотеката на seaborn:

data = sns.load_dataset('iris')
data.head()

Кодираща целева променлива

Мащабиране на функции

Прилагане на нормализиране:

for column in data.columns[:-1]:
data[column] = ( data[column]-min(data[column]) ) / ( max(data[column])-min(data[column]) )

Разделяне на независими и зависими функции

X = data.iloc[:, :-1].values
Y = data.iloc[:, -1].values

Модел на класификация на Knn

Намерете оптималната стойност на k, като използвате диаграмата на разходите:

def knn_classification_model(dataidx, X, k):
 temp = X[dataidx] - X
 temp = temp**2
 temp = np.sum(temp, axis=1)**(1/2)
 idx = np.argpartition(temp, k)
 k_min_idx = Y[idx[1:k+1]]
 k_min_idx = pd.Series(k_min_idx)
 res = k_min_idx.value_counts().index[0]
 return res
# Find cost
def find_cost(y_pred, Y):
  t = np.sum((y_pred - Y)**2)/len(Y)
  return t
# 
cost = np.zeros(20)
for k in range(1, 20):
  y_pred = []
  for i in range(len(data)):
  y_pred.append(knn_classification_model(i, X, k))
  cost[k] = find_cost(y_pred, Y)

k = 8 има минималната цена, т.е. това е оптималната стойност, така че използването на тази стойност в модела:

Намиране на точност

accuracy = len(data.loc[y_pred==Y_label])/len(data)*100
accuracy

Точността на нашия модел е 98%. По същия начин, за регресия ще изчислим средната/медианата на k-най-близките точки от данни.

С това завършихме нашия KNN алгоритъм. Надяваме се, че ви е било полезно. Ако харесвате блога ми, разгледайте някои от предишните ми блогове:

  1. "Линейна регресия"
  2. OpenCV
  3. Сироден
  4. Панди
  5. Нъмпи

Приятно учене!