机器学习-11-k近邻算法

本文详细介绍了K近邻算法(KNN)的基本原理,包括欧式距离、曼哈顿距离和余弦相似度等距离度量方法。并提供了KNN算法的Python代码实现,利用线性扫描和KD树优化搜索过程。KNN通过对新样本与数据集中样本的距离计算,找出最近的k个邻居,并根据邻居的类别进行投票决定新样本的类别。
摘要由CSDN通过智能技术生成

给定一个数据集,对新的输入样本,在数据集中找到与新的输入样本距离最近的k个样本,将这k个样本中最多数属于某个类的那个类别当作新的输入样本的类别。
在这里插入图片描述

距离度量

  • 欧式距离: D = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 D=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} D=(x2x1)2+(y2y1)2
  • 曼哈顿距离: D = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ D=|x_2-x_1|+|y_2-y_1| D=x2x1+y2y1
  • 余弦值

实现

K近邻最简单的实现就是直接遍历整个数据集,叫线性扫描(linear scan),但是这样的话,需要将输入的样本和数据集中每个样本进行度量距离,如果数据集很大的话,计算是非常耗时的。所以比较常见的是KD树。

代码

np.tile

from numpy import tile
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    #距离计算
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2      #平方
    sqDistances = sqDiffMat.sum(axis=1)     #根号下平方相加
    distances = sqDistances**0.5    #根号
    sortedDistIndicies = distances.argsort()    #排序
    classCount={}
    #选择距离最小的k个点
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        #排序,将classCount字典分解为元祖列表,导入itemgeeter方法,按照第二个元素的次序对元祖进行排序
        #此处排序为逆序,即从大到小排序,最后返回发生频率最高的元素标签。
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]
    # 为预测数据所在分类:kNN.classify0([0,0], group, labels, 3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值