• K近邻模型


    k近邻模型

    基本思想

    k近邻算法还是很直观的,准确的来说它不是一种学习算法,而是一种统计方法,不具备学习过程,一次性就可以给出结果。
    其本质思想是将特征空间划分成一个个的单元(cell),其中每个cell的区域由距离该点比其他点更近的所有点定义,所有的cell组成了整特征空间。

    如上图所示:
    考虑样本x1构成的cell,记作cellx1

    • 对于x2,其距离x3x1近,因此,x2无法成为cellx1中的一员
    • 对于x3,其距离x2x1近,因此,x3无法成为cellx1中的一员
    • 对于x4,其距离x2,x3,x5均比x1近,因此,x4无法成为cellx1的一员
    • 对于x5,其距离x2,x3,x4均比x1近,因此,x5无法成为cellx1的一员
      因此,x1组成的cell为空,即cellx1=

    再考虑样本x2构成的cell,记作cellx2

    • 对于x1,由于没有任何一样比x2距离x1更近,因此x1成为其一员
    • 对于x3,由于没有任何一样比x3距离x1更近,因此x3成为其一员
    • 对于x4,其距离x3,x5均比x2近,因此,x4无法成为其一员
    • 对于x5,其距离x3,x4均比x2近,因此,x5无法成为其一员
      因此,cellx2={x1,x3}

    同理我们可以得到cellx3={x2}cellx4={x5}cellx5={x4}
    这样一来,有所有cell定义的区域就组成了整个空间,就可以通过每个cell构成的区域中的样本来对新样本进行预测。

    上面只是理想中的方式,是一种辅助理解的办法,存在诸多问题,比如区域不好定义,上面的示例中我们只是规定了一个cell所必须包含的元素,并没有定义由这些元素构成的区域。
    在实际中,我们往往直接使用与每个样本x最近的k个样本Nk(x)的类别对x的类别进行预测,比如下面的所属表决规则。
    (1)y=argmaxcjxiNkxI(yi=cj),i=1,2,,N;j=1,2,,K
    其中N为全体样本,K为所有类别数,而距离度量往往使用L1范数,当然其他距离也行,下面是三种常见的距离。
    曼哈顿距离(L1范数):
    (2)L1(xi,xj)=l=1n|xi(l)xj(l)|

    (3)L2(xi,xj)=(l=1n|xi(l)xj(l)|2)12

    (4)L(xi,xj)=maxl|xi(l)xj(l)|

    三种距离在二维空间中的等距图如下:

    对于L1(黑色),由于夹角θ=π4,所以黑线上的点到原点的L1始终相等,由于橙色为半径为1的圆,因此橙色上的点到原点的L2均为半径,红色为边长为2的正方形,其上的点到原点的L均为边长的一半。(图中指示错误L3应改为L)

    kd树

    从上面的介绍可知,若想找去每个样本的k个近邻Nxk则需要计算N次后再排序选出,那么所有样本计算的时间复杂度至少是N2级别,显然代价无法承受,因此需要一种能够有效减少冗余计算的方式。而kd树就是其中一种,它包括建树和查找两个过程。

    平衡树的建立

    kd树的建立过程比较简单,主要遵从如下思想:
    假设样本为d维,首先取所有样本在d=1维度上的值并排序,找到中位数(若为偶数则计算二者均值),取出中位数对应的样本(若不存在则在其相邻处随机取一个)建立根结点,并对左右两部分样本进行递归进行上述操作d=(d+1)%d

    示例:
    有以下二维空间中的数据集,要求建立一个kd

    T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}

    首先让所有样本在d=1维上进行从小到大的排序得到:

    T1={(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)}

    得到中位数=5+72=6,但是样本中不含这个样本,因此需要在两侧附件随机取1个构建根结点,机器学习课本中选择7,这里我们以5作为示例。
    因此得到rootT1=(5,4), T11={(2,3),(4,7)}, T12={(7,2),(8,1),(9,6)}

    继续构建下一层d=2维上样本
    对于T11d=2上进行排序得到T211=T11,计算中位数=3+72=5,由于T211中不存在第二维为5的样本,因此随机选1,这里选rootT211=(2,3),因此T2112={(4,7)}成为它的右子树(同时也是右根,右叶结点),并且无左子树。

    对于T12d=2上进行排序得到T212={(8,1),(7,2),(9,6)},计算中位数=2,因此得到rootT212=(7,2), 左子树(左根,左叶)T2121={(8,1)},右子树(右根,右叶)T2122={(9,6)}
    至此,原始样本的对应的平衡kd树构建完毕。
    下面是图例:

    树的查找

    树的查找包括正向和反向两个过程,正向和建树类似只需一一判断即可,反向也是必须的,因为正向过程不能保证所查找到的一定是其最近邻(需要参见kd树原始论文)。

    • 正向递归查找。当给出一个样本在查找与它的最近邻样本时(限定L2距离)时,需要依次从根节点往下查找,和建树过程类似,比如在建立第一层时用的是d=1即第一维值的大小,那么查找时也应使用样本的第一维与其第一维进行比较,该过程递归进行直至找到叶子结点。
    • 反向回溯查找。在得到正向查找中与样本点xi的近似最近邻点xj时,以xi为圆心,xixjL2距离为半径构建一个圆。回溯,依次各个区域是否与圆相交,若相交找到与其相交的最小区域对应的结点,
      示例:
      我们考虑比机器学习课本更复杂一些的情况,如下。

      首先我们容易根据正向查到找到样本点S所处的区域即B的右子树对应的区域,也是叶结点D的范围。构建以S为圆心,dSD为半径的圆。然后检查F对应的区域是否与圆相交,显然不相交,于是F向上回溯至A的上半部分C对应的区域,显然与圆相交。于是检查C的左区域G对应的区域,无相交,检查C的右区域E是否相交,相交,更新半径为dSE,并构建新圆,如下。

    继续检查E的上区域H是否相交,相交,但是距离太远不用更新,继续检查E的下区域I是否相交,明显相交,且半径可以更新为dIS,继续这样操作之后,还可以更新半径为dKS(图没画好),最终的得到S的最近邻点K

  • 相关阅读:
    牛客:小美的01串翻转
    【微服务生态】Docker
    windows 启用对TLS1.2和1.3的支持,并禁用对TLS1.0的支持
    1688关键字搜索工厂数据 API
    nginx代理gitee
    基于FPGA的图像缩小算法实现,包括tb测试文件和MATLAB辅助验证
    深度学习(PyTorch)——flatten函数的用法及其与reshape函数的区别
    QPixmap图像处理详解
    本周面试经验总结
    vue循环语句v-for中元素绑定值问题
  • 原文地址:https://www.cnblogs.com/hywang1211/p/18064458