前言
KNN能够说是最简略的分类算法之一,同时也是最罕用的分类算法之一。KNN算法是有监督学习的分类算法,与机器学习算法Kmeans有点像,但却是有本质区别的
定义
- 一个样本a在特色空间中离它最近的K个最近的样本中,大多数属于某个类别,则a样本也属于这个类别
如何计算其余样本与a样本的间隔?
- 个别时候咱们应用 欧式间隔
- 二维空间:$p =\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}$
- N维空间:$p = \sqrt{\sum_{i=0}^{n}(x_i-y_i)^2}$
K值的抉择
- K值过小 容易受到异样点的影响
- K值过大 容易受到样本平衡的问题
如何抉择K值
- 应用穿插验证
KNN流程步骤
- 计算 样本a与训练集中每个样本点的间隔(欧式间隔)
- 对计算出来的所有间隔进行排序
- 选取前K个最小间隔的样本
- 依据K个样本中哪个类别多,样本a就属于哪个类别
代码
导入应用包 numpy matplotlib Counter
from collections import Counterimport matplotlib.pyplot as pltimport numpy as np
应用 loadtxt 加载数据 数据样本 前两列为特征值,最初一列为标签值
x_new 为新样本
data = np.loadtxt("exe2.txt",delimiter=',')x = data[:,:2]y = data[:,-1]x_new = np.array([70.534788289883,50.8558115276420])
画图展现
plt.scatter(x[y==0, 0], x[y==0, 1], color='r')plt.scatter(x[y==1, 0], x[y==1, 1], color='g')plt.scatter(x_new[0], x_new[1], color='b')plt.show()
list 用于贮存 新样本点到每个样本的间隔
argsort函数 会将元素从小到大排序,并返回索引
list = []for i in x: distance = np.sqrt(np.sum(i - x_new)**2) list.append(distance)list_sort = np.argsort(list)print(list_sort)k = 6ten_y = [y[i] for i in list_sort[:k]]print(Counter(ten_y))
残缺代码
from collections import Counterimport matplotlib.pyplot as pltimport numpy as npdata = np.loadtxt("exe2.txt",delimiter=',')x = data[:,:2]y = data[:,-1]x_new = np.array([70.534788289883,50.8558115276420])# 0 类用红色示意 1 类用绿色示意 新样本用 蓝色示意plt.scatter(x[y==0, 0], x[y==0, 1], color='r')plt.scatter(x[y==1, 0], x[y==1, 1], color='g')plt.scatter(x_new[0], x_new[1], color='b')plt.show()# 用于报存间隔list = []for i in x: distance = np.sqrt(np.sum(i - x_new)**2) list.append(distance)list_sort = np.argsort(list)print(list_sort)k = 6ten_y = [y[i] for i in list_sort[:k]]print(Counter(ten_y))