K-近邻算法(KNN)

什么是K-近邻算法?

K-近邻算法(k-Nearest Neighbors,KNN) 算法是一种分类算法
1968年由 Cover 和 Hart 提出,应用场景有字符识别、文本分类、图像识别等领域;
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

1 K-近邻算法实现流程

1)计算已知类别数据集中的点与当前点之间的距离
2)按距离递增次序排序
3)选取与当前点距离最小的k个点
4)统计前k个点所在的类别出现的频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类

2 k值的选择

  • K值过小:容易受到异常点的影响
    相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
  • k值过大:受到样本均衡的问题
    相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
  • 近似误差:对现有训练集的训练误差,关注训练集,如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。
  • 估计误差:可以理解为对测试集的测试误差,关注测试集,估计误差小说明对未知数据的预测能力好,模型本身最接近最佳模型。

3 k近邻搜索-kd树

根据KNN每次需要预测一个点时,我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高,针对N个样本,D个特征的数据集,其算法复杂度为O(DN2)

kd树:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。这样优化后的算法复杂度可降低到O(DNlog(N))

3.1 案例分析
a. 树的建立

给定一个二维空间数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造一个平衡kd树。
哪个维度方差大,哪个维度先切分
第一次切分(x轴):对x轴进行排序,y轴伴随x轴排序;取中位数x=7位置,进行切分;
x轴:2,5,9,4,8,7 ===> 2,4,5,7,8,9
y轴:3,4,6,7,1,2 ===> 3,7,4,2,1,6
第二次切分(y轴):(7,2)位置不动,对y轴的左右子树进行排序,x轴伴随y轴排序;取左子树中位数y=4,右子树中位数y=6位置,进行切分;
x轴:2,4,5,7,8,9 ===> 2,5,4,7,8,9
y轴:3,7,4,2,1,6 ===> 3,4,7,2,1,6
第三次切分(x轴):(5,4)、(7,2)、(9,6)位置不动,其余都是叶结点,直接切分
x轴:2,4,5,7,8,9 ===> 2,5,4,7,8,9
y轴:3,7,4,2,1,6 ===> 3,4,7,2,1,6
在这里插入图片描述
在这里插入图片描述

b. 最近领域的搜索

假设标记为星星的点是 test point, 绿色的点是找到的近似点,在回溯过程中,需要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere),如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。

  • kd树的搜索过程
  1. 二叉树搜索比较待查询节点和分裂节点的分裂维的值,(小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点);
  2. 顺着“搜索路径”找到最近邻的近似点;
  3. 回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中,是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索;
  4. 重复这个过程直到搜索路径为空。

4 距离度量

4.1 闵可夫斯基距离

闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。
闵氏距离
其中n是维度;p是一个变参数,根据p的不同,闵氏距离可以表示某一种距离。
(1) 欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
(2) 在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。
(3) 国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离

  • 闵氏距离的缺点:
    (1) 将各个分量的量纲(scale),也就是“单位”相同的看待了;
    (2) 未考虑各个分量的分布(期望,方差等)可能是不同的。
4.2 标准化欧氏距离

标准化欧氏距离是针对欧氏距离的缺点而作的一种改进。
思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。假设样本集X的均值(mean)为m标准差(standard deviation)为s标准化变量表示为X*
标准化欧氏距离
如果将方差的倒数看成一个权重,也可称之为加权欧氏距离(Weighted Euclidean distance)。

4.3 余弦距离

几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。
余弦距离
夹角余弦取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。

4.4 杰卡德距离

杰卡德相似系数(Jaccard similarity coefficient):两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数。
杰卡德距离(Jaccard Distance):与杰卡德相似系数相反,用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度
杰卡德距离
举例:X=[[1,1,0], [1,-1,0], [-1,1,0]],经计算得:d = 0.5000 0.5000 1.0000
注:以下计算中,把杰卡德距离定义为不同的维度的个数占“非全零维度”的比例

4.5 汉明距离

两个等长字符串s1与s2的汉明距离(Hamming Distance)为:将其中一个变为另外一个所需要作的最小字符替换次数。

汉明重量:是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。因此,如果向量空间中的元素a和b之间的汉明距离等于它们汉明重量的差a-b。

应用:汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。

举例:X=[[0,1,1],[1,1,2],[1,5,2]],经计算得:d = 0.6667 1.0000 0.3333
注:以下计算方式中,把2个向量之间的汉明距离定义为2个向量不同的分量所占的百分比。

4.6 马氏距离

马氏距离是基于样本分布的一种距离。

  • 马氏距离是由印度统计学家马哈拉诺比斯提出的,表示数据的协方差距离。它是一种有效的计算两个位置样本集的相似度的方法;
  • 与欧式距离不同的是,它考虑到各种特性之间的联系,即独立于测量尺度;
  • 马氏距离定义:设总体G为m维总体(考察m个指标),均值向量为μ=(μ1,μ2,… …,μm), 协方差阵为∑=(σij),则样本X=(X1,X2,… …,Xm,)与总体G的马氏距离定义为:
    马氏距离
    马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为∑的随机变量的差异程度:如果协方差矩阵为单位矩阵,马氏距离就简化为欧式距离;如果协方差矩阵为对角矩阵,则其也可称为正规化的欧式距离。
  • 马氏距离特性
  1. 量纲无关,排除变量之间的相关性的干扰;
  2. 马氏距离的计算是建立在总体样本的基础上的,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;
  3. 计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可;
  4. 还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如三个样本点(3,4),(5,6),(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线。这种情况下,也采用欧式距离计算。
    欧式距离&马氏距离:
    欧式vs马氏
    马氏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值