Python实现kNN算法

本文介绍了一种简单直观的机器学习分类方法——k-最近邻(kNN)算法,并通过Python代码实现了该算法。kNN算法根据样本最邻近的k个训练样本的类别来决定待分类样本的类别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python实现kNN算法


1. 原理

k-最近邻: kNN(k-NearestNeighbor)分类算法机器学习中最简单的分类方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
k-NN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近k个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

  • 优点: 简单,易于理解,无需训练,对异常值不敏感。
  • 缺点:计算时间和空间复杂度高。

2. 算法流程

  • 准备数据及数据预处理(类型转换,归一化等)
  • 计算及分类
    • 选择一种距离计算方式, 计算当前样本和所有数据集样本的距离
    • 按照距离递增次序进行排序, 选取与当前距离最小的 k 个点
    • 对于离散分类, 返回 k 个点出现频率最多的类别作为预测分类; 对于回归, 返回 k 个点的加权值作为预测值

3. python代码实现及注释

#导入相关包
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值