"""
простейший пример метода K-ближайших соседей
есть точки на плоскости, каждая из которых имеет координаты - по горизонтали и вертикали
и принадлежит одному из двух классов
  двумерный массив X[[][]] хранит координаты точек
  массив y[] хранит - к какому классу принадлежит каждая точка 
  
"""

import numpy as np
from sklearn import neighbors, datasets

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) # массив точек на плоскости
y = np.array([1, 1, 1, 2, 2, 2]) # массив ответов к точкам. каждая точка принадлежит одному из двух классов 

n_neighbors = 3 # K-целое значение, указанное пользователем. Количество соседей которое будет искаться

clf = neighbors.KNeighborsClassifier(n_neighbors, weights = 'uniform') # объявляю экземпляр класса # параметр весовой функции может принимать 2 значения 'uniform' или 'distance'
clf.fit(X, y) # передаю данные функции экземпляра класса

new_tochka = [0.8, 1] # объявляю новую точку, которую нужно классифицировать к одному из двух классов. 
print("новая точка ",new_tochka," принадлежит классу = ", clf.predict([new_tochka])) # вывожу на экран к какому классу принадлежит данная точка


#допишу этот пример так, чтобы не только на экран выводилось сообщение, но и был рисунок
import matplotlib.pyplot as plt # подключаю юиблтотеку для отрисовки
# так как каждая точка имеет 2 координаты, одна по горизонтали и одно по вертикали, то
x_ = X[0:, :1] # передаю значение координат по горизонтали
y_ = X[0:, 1:] # передаю значение координат по вертикали

fig = plt.figure()
fig.add_subplot(111)

plt.scatter(x_[0:3], y_[0:3],color='red',  edgecolor='black', s=20) # отрисовка точек первого класса 
plt.scatter(x_[3:6], y_[3:6],color='blue',  edgecolor='black', s=20) # отрисовка точек второго класса

color_=['','red','blue'] # объясввляю массив с цветами 1 элемент 'red' 2 'blue'

clas= int(clf.predict([new_tochka])) # узнаю к какому классу принадлежит новая точка, но переменной присваиваю значение int 1 или 2 а не массив с одним элементом [1] или [2]
plt.scatter(new_tochka[0:1],new_tochka[1:2], color=color_[clas], s=80)# отрисовываю новую точку большую по размеру
#цвет в зависимости от класса к которому её отнёс классификатор на строку выше красный или синий класс 1 или 2 соответственно
plt.title("3-Class classification (k = %i, weights = '%s'\n новая точка %s принадлежит классу %i)"% (n_neighbors, 'uniform',new_tochka, clas))#отрисовка заголовка
   
plt.show() # вывожу на экран отрисовку всего
