k-NN(k-近邻)算法

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)

猜你喜欢

转载自blog.csdn.net/wang_jiankun/article/details/80724459