前言
KNN可以说是最简单的分类算法之一,同时也是最常用的分类算法之一。KNN算法是有监督学习的分类算法,与机器学习算法Kmeans有点像,但却是有本质区别的
定义
- 一个样本a在特征空间中离它最近的K个最近的样本中,大多数属于某个类别,则a样本也属于这个类别
- 如何计算其他样本与a样本的距离?
- 一般时候我们使用 欧式距离
- 二维空间:
- N维空间:
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))