Вы находитесь на странице: 1из 3

Практичне заняття 18

«Алгоритм реализации KNN»

#Генерация данных
import numpy as np

def create_data():
features = np.array(
[[2.88, 3.05], [3.1, 2.45], [3.05, 2.8], [2.9, 2.7], [2.75, 3.4],
[3.23, 2.9], [3.2, 3.75], [3.5, 2.9], [3.65, 3.6], [3.35, 3.3]])
labels = ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B']
return features, labels

#"Распечатать пример данных


features, labels = create_data()
print('features: \n', features)
print('labels: \n', labels)

# "Пример диаграммы данных


from matplotlib import pyplot as plt

plt.figure(figsize=(5, 5))
plt.xlim((2.4, 3.8))
plt.ylim((2.4, 3.8))
x_feature = list(map(lambda x: x[0], features)) # Возвращает значение х характеристики каждого
из данных
y_feature = list(map(lambda y: y[1], features))
plt.scatter(x_feature[:5], y_feature[:5], c="b") # Нарисуйте точки данных метки «А» на холсте
plt.scatter(x_feature[5:], y_feature[5:], c="g")
plt.scatter([3.18], [3.15], c="r", marker="x") # Координаты проверяемой точки: [3.1, 3.2]

# Алгоритм реализации KNN


# "Полное внедрение метода KNN

def knn_classify(test_data, train_data, labels, k):


distances = np.array([]) # Создать пустой массив для хранения расстояния

for each_data in train_data: # Используйте евклидово расстояние для расчета сходства данных
d = d_eucledian((test_data, each_data)
distances = np.append(distances, d)

sorted_distance_index = distances.argsort() # Получить индекс отсортирован по расстоянию


sorted_distance = np.sort(distances)
r = (sorted_distance[k]+sorted_distance[k-1])/2 # Расчет

class_count = {}
for i in range(k): # Большинство голосов
vote_label = labels[sorted_distance_index[i]]
class_count[vote_label] = class_count.get(vote_label, 0) + 1

final_label = majority_voting(class_count)
return final_label, r

# Классификационный прогноз
test_data = np.array([3.18, 3.15])
final_label, r = knn_classify(test_data, features, labels, 5)
final_label

# Визуализация алгоритма принятия решения алгоритмом KNN.


def circle(r, a, b): # Чтобы нарисовать круг, круг выражают в полярных координатах: x = r *
cosθ, y = r * sinθ
theta = np.arange(0, 2*np.pi, 0.01)
x = a+r * np.cos(theta)
y = b+r * np.sin(theta)
return x, y

k_circle_x, k_circle_y = circle(r, 3.18, 3.15)

plt.figure(figsize=(5, 5))
plt.xlim((2.4, 3.8))
plt.ylim((2.4, 3.8))
x_feature = list(map(lambda x: x[0], features)) # Возвращает значение х характеристики каждого
из данных
y_feature = list(map(lambda y: y[1], features))
plt.scatter(x_feature[:5], y_feature[:5], c="b") # Нарисуйте точки данных метки «А» на холсте
plt.scatter(x_feature[5:], y_feature[5:], c="g")
plt.scatter([3.18], [3.15], c="r", marker="x") # Координаты проверяемой точки: [3.1, 3.2]
plt.plot(k_circle_x, k_circle_y)

# Интерактивный модуль
from ipywidgets import interact, fixed

def change_k(test_data, features, k):


final_label, r = knn_classify(test_data, features, labels, k)
k_circle_x, k_circle_y = circle(r, 3.18, 3.15)
plt.figure(figsize=(5, 5))
plt.xlim((2.4, 3.8))
plt.ylim((2.4, 3.8))
x_feature = list(map(lambda x: x[0], features)) # Возвращает значение х характеристики
каждого из данных
y_feature = list(map(lambda y: y[1], features))
plt.scatter(x_feature[:5], y_feature[:5], c="b") # Нарисуйте точки данных метки «А» на холсте
plt.scatter(x_feature[5:], y_feature[5:], c="g")
plt.scatter([3.18], [3.15], c="r", marker="x") # Координаты проверяемой точки: [3.1, 3.2]
plt.plot(k_circle_x, k_circle_y)

interact(change_k, test_data=fixed(test_data),
features=fixed(features), k=[3, 5, 7, 9])

Это получаю!

Вот это нет! Здесь весь интерес!

Вам также может понравиться