k近邻算法(KNN)

1.K-近邻算法

K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一。K-近邻算法是最简单的分类器,没有显式的学习过程或训练过程,是懒惰学习(Lazy Learning)。当对数据的分布只有很少或者没有任何先验知识时,K 近邻算法是一个不错的选择。

​ K近邻算法既能够用来解决分类问题,也能够用来解决回归问题。该方法有着非常简单的原理:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。

三个基本要素:距离度量、k值的选择、分类决策的规则

2.K-近邻模型

​KNN中,当训练集、距离度量、k值及分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一地确定。这相当于根据上述要素将特征空间划分为一些子空间,确定子空间里的每个点所属的类。

单元(cell):特征空间中对每个训练实例点x,距离该点比其他点更近的所有点组成的一个区域叫做单元。

类标记( classlabel):每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。❎最近邻法将实例x_{i}的类y_{i}作为其单元中所有点的类标记( classlabel)。这样,每个单元的实例点的类别是确定的。图3.1是二维特征空间划分的一个例子。

2.1 距离度量

特征空间中两个实例点之间的距离是二者相似程度的反应,所以K近邻算法中一个重要的问题是计算样本之间的距离,以确定训练样本中哪些样本与测试样本更加接近。
在实际应用中,我们往往需要根据应用的场景和数据本身的特点来选择距离计算方法。当已有的距离方法不能满足实际应用需求时,还需要针对性地提出适合具体问题的距离度量方法。
Lp​距离

当 p = 2,为欧氏距离(Euclidean Distance)

当 p = 1,为曼哈顿距离(Manhattan Distance)

当 p = ∞,为各个坐标距离的最大值

下图为二维空间中,与原点的L_{p}距离为1的点的图形(L_{p}=1) 

 

 

欧氏距离(Euclidean Distance)

曼哈顿距离(Manhattan Distance) 

余弦相似度 (Cosine Similarity)

余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。 

其它
当已有距离度量方法不能满足需求时,可以探索符合需求的距离度量方法。

实际的数据中,往往是离散型变量和连续型变量同时存在,如何计算这种混合变量下的样本相似度是一个开放性的问题。一种简单的方法是,在进行距离计算之前对样本中的离散型变量进行One-Hot编码,然后选取上述介绍的距离计算方法进行处理。
2.2 k 值的选择 

不同k值的影响
一般而言,从k = 1开始,随着的逐渐增大,K近邻算法的分类效果会逐渐提升;在增大到某个值后,随着的进一步增大,K近邻算法的分类效果会逐渐下降。

k值较小,相当于用较小的邻域中的训练实例进行预测,只有距离近的(相似的)起作用

相当于用较小的邻域中的训练实例进行预测,更容易受噪声干扰,容易使模型发生过拟合

  • 单个样本影响大
  • “学习”的近似误差(approximation error)会减小,但估计误差(estimation error)会增大
  • 噪声敏感
  • 整体模型变得复杂,容易发生过拟合

k值较大,这时距离远的(不相似的)也会起作用

相当于用较大的邻域中的训练实例进行预测,这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误,使模型更容易发生欠拟合

  • 近似误差会增大,但估计误差会减小
  • 整体的模型变得简单

特例:k = 1(最近邻算法)
此时,KNN的泛化错误率上界为贝叶斯最优分类器错误率的两倍

特例:k = N
K近邻算法对每一个测试样本的预测结果将会变成一样(属于训练样例中最多的类)。

k值选择

  • 一般k值较小。
  • k通常取奇数,避免产生相等占比的情况。
  • 往往需要通过**交叉验证(Cross Validation)**等方法评估模型在不同取值下的性能,进而确定具体问题的K值。 

2.3 分类决策规则

k近邻法中的分类决策规则往往是多数表决,即由输入实例的k个近邻的训练实例中的多数类决定输入实例的类别。

3.K-近邻优缺点

优点:

  • 简单易懂
  • 对异常值不敏感
  • 更适合多分类问题

缺点:

  • 受k值得影响较大
  • 空间复杂度较高
  • 时间复杂度较高
  • 可解释性较差 

4.评价

在对测试样本进行预测时,因为只用到训练样本中与其最接近的K个 样本,K近邻算法的偏置(Bias)往往很低,而方差(Variance)则 很高。当训练集较小的时候,K近邻算法易出现过拟合。

5.kd树

kd树是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树算法包含了构造kd树和搜索kd树两部分。

5.1 构造kd树

步骤1:

开始:构造根结点,根结点对应于包含T的k维空间的超矩形区域。 选择x_{i}^{1}作为坐标轴,以T中所有实例的x_{i}^{1}坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴x_{i}^{1}垂直的超平面实现。 由根结点生成深度为1的左,右子结点:左子结点对应坐标 x_{i}^{1}小于切分点的子区域,右子结点对应坐标x_{i}^{1}大于切分点的子区域。 

步骤2:

重复:对深度为j的结点,选择x_{i}^{l}为切分的坐轴,l=j(mod k)+1,以该结点的区域中所有实例的x_{i}^{l}坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴 x_{i}^{l}垂直的超平面实现。 由该结点生成深度为j+1的左、右子结点:左子结点对应坐标 x_{i}^{l}小于切分点的子区域,右子结点对应坐标x_{i}^{l}大于切分点的子区域。 将落在切分超平面上的实例点保存在该结点。 

步骤3:

直到两个子区域没有实例存在时停止,从而形成kd树的区域划分。 

5.2 搜索kd树  

步骤1:

从根结点出发,递归地向下访问kd树。如果预测样本S的坐标在当前维度小于切分点,则向左访问,反之,向右访问,直到访问到叶结点,取该叶结点作为当前S的最近邻点。 

步骤2:

以S和当前最近邻点作圆。

步骤3:

从当前叶结点回退到父结点,并访问父结点的另一个分支,检查该结点或者子空间是否与圆相交 1)若相交,则需要往下访问子结点,查找是否存在比当前最近邻点更近的结点;

               a.若存在更近的样本,则更新最近邻点,并重复步骤2;

               b.若不存在,则重复步骤3;

2)若不相交,则不需要访问这一分支,继续回退到上一层父结点,重复步骤3。 

步骤4:

退回到根结点后结束搜索过程,并获得最近邻点。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩軒轩儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值