前言
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 Counter
import matplotlib.pyplot as plt
import 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 = 6
ten_y = [y[i] for i in list_sort[:k]]
print(Counter(ten_y))
残缺代码
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
data = 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 = 6
ten_y = [y[i] for i in list_sort[:k]]
print(Counter(ten_y))