k-NN(k-最近邻)算法
1. 原理
k-NN(k-NearestNeighbor)分类算法机器学习中最简单的分类方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
k-NN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近k个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
- 优点: 简单,易于理解,无需训练,对异常值不敏感。
- 缺点:计算时间和空间复杂度高。
2. 算法流程
- 准备数据及数据预处理(类型转换,归一化等)
- 计算及分类
- 选择一种距离计算方式, 计算当前样本和所有数据集样本的距离
- 按照距离递增次序进行排序, 选取与当前距离最小的 k 个点
- 对于离散分类, 返回 k 个点出现频率最多的类别作为预测分类; 对于回归, 返回 k 个点的加权值作为预测值
3. 代码实例
#导入相关包
import numpy as np
#创建数据集
def creatDataset():
trainSet=np.array([[0,0],[0.1,0],[1.0,1.0],[1.0,1.1]])
labels=['A','A','B','B']
return trainSet,labels
#k-NN算法分类
def Classify(x,trainSet,labels,k):
#计算距离
diff=(trainSet-x)**2
dist= (diff.sum(axis=1))**0.5
#对距离进行排序,升序
sortMin=dist.argsort()
#字典,用来存放k个相邻样本属于各类别的数量
classCount={}
for i in range(k):
#统计各类别数量
classCount[labels[sortMin[i]]]=classCount.get(labels[sortMin[i]],0)+1
#对字典按值排列,降序
classCount=sorted(classCount.items(),key = lambda x:x[1],reverse = True)
#返回,数量最多的类别
return classCount[0][0]
if __name__ == "__main__":
#测试样本
x=[1,1.2]
#调用函数分类
X,Y = creatDataset()
result=Classify(x,X,Y,2)
#输出分类类别名
print(result)