6-K近邻法-分类-监督学习-机器学习

参考:李航《统计学习方法》

K近邻法(k-nearest neighbor,KNN)

    假设给定一个训练数据集,每个实例点(特征向量X)对应的类别(Y)已经确定。新的输入实例点的类别,由离它最近的K个实例点的类别,通过多数表决的方式决定。当k=1时,输入实例点的类别,将由离它最近的那个实例点的类别所决定,称为 最近邻法
    k值的选择距离度量分类决策规则是k近邻法的三个基本要素. k近邻法 1968 年由 Cover 和 Hart提出。

K近邻法的三个基本要素

  • 距离度量
    特征空间 中两个实例点的距离是两个实例点相似 程度的反映,由不同的距离度量所确定的最近邻点是不同的。一般使用的距离是 欧氏距离,但也可以是其他距离, 如更一般的 Lp距离(Lp-distance)或 Minkowski距离(Minkowski distance)。

  • k值的选择
    k值的选择会对k近邻法的结果产生重大影响。
较小的k值
    这样,只有 少数较近的实例点 才会影响预测,而”较近“代表”较为相似“,学习的 近似误差(approximation error) 会减小。
    但缺点是,预测结果对邻近的实例点非常敏感,学习的估计误差(estimation error) 会增大,如果邻近的实例点恰好就是噪声,预测明显会出错。
    换言之,k值的减小就意味着整体模型变得 复杂 ,容易发生 过拟合。
较大的k值
    这样,因为纳入考虑的点多,所以 较远的实例点 也会影响预测,而“较远”意味着“不相似”,学习的近似误差会增大。
    但优点是,预测结果对邻近的实例点并不敏感,学习的估计误差会减小。即使邻近点是噪声,对预测结果影响也较小。
    换言之,K值的增大表明整体模型较为简单。
分类决策规则(majority voting rule)
    一般而言是多数表决规则(majority voting rule),也就是由最邻近的K个实例点中的多数类别所决定。

如何找出离某点最近的K个实例点?

  • 枚举法
    逐一计算训练数据集中每个实例点与该点的距离,然后选出最小值,也称为 线性扫描(linear scan)
    缺点:当训练数据集容量很大,或者每个实例点包含的维度很高,比如10维,那么 计算量非常大

  • KD树(K-dimension tree)

1) KD树是什么?

    实际数据一般都会呈现簇状的聚类形态,我们可以将簇与簇划分开来。而类似地,KD树是棵 二叉平衡树 ,其目的是把整个 输入空间X 划分为特定的几个部分,然后在特定空间内进行相关搜索操作。

2) KD树是谁提出来的?

    1975年,来自斯坦福大学的Jon Louis Bentley在ACM杂志上发表的一篇论文:Multidimensional Binary Search Trees Used for Associative Searching 中正式提出和阐述的了如下图形式的把空间划分为多个部分的k-d树。

3) 如何构建KD树?

    假设有一个训练集,包含6个二维实例点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}【暂忽略其类别(Y值)】。为了能有效的找到最近邻,KD树采用分而治之的思想,即将整个空间划分为几个小部分,具体步骤如下。
S1 确定要分割的坐标轴。
具体是:6个实例点在x,y维度上的数据方差分别为39,28.63,所以在x轴上 方差更大,故要分割 的坐标轴是X轴。【这个划分规则跟李航书上的循环选取坐标轴规则不同,但我觉得这个更有实际意义
S2 确定要分割的坐标轴的中位点。
具体是:将实例点根据X轴上的值排序,中位值是7,对应的实例点是(7,2)。 。这样,该节点的分割超平面就是垂直于X轴,通过实例点(7,2);
S3 确定左子空间和右子空间。
具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};
S4 如上算法所述,KD树的构建是一个递归过程。
    我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。

4)如何用KD树查询离某点最近的点?

举例:查询点(2.1,3.1)
    星号表示要查询的点(2.1,3.1)。很快就能找到最邻近的近似点,也就是叶子节点(2,3)。而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。为了找到真正的最近邻,还需要进行相关的‘回溯'操作。也就是说,算法首先沿搜索路径反向查找是否有距离查询点更近的数据点。以查询(2.1,3.1)为例:

二叉树搜索:先从(7,2)点开始进行二叉查找,然后到达(5,4),最后到达(2,3),此时搜索路径中的节点为<(7,2),(5,4),(2,3)>,首先以(2,3)作为当前最近邻点,计算其到查询点(2.1,3.1)的距离为0.1414。
回溯查找:在得到(2,3)为查询点的最近点之后,回溯到其父节点(5,4),并判断在该父节点的其他子节点空间中是否有距离查询点更近的数据点。以(2.1,3.1)为圆心,以0.1414为半径画圆,如下图所示。发现该圆并不和超平面y = 4交割,因此不用进入(5,4)节点右子空间中(图中灰色区域)去搜索。
最后,再回溯到(7,2),以(2.1,3.1)为圆心,以0.1414为半径的圆更不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。至此,搜索路径中的节点已经全部回溯完,结束整个搜索,返回最近邻点(2,3),最近距离为0.1414。

【问题:如何找剩下的K-1个点?】

猜你喜欢

转载自blog.csdn.net/yeziand01/article/details/80597329