KNN算法优缺点

  • 优点
    (1) 精度高
    (2) 对异常值不敏感:某个异常值对整个结果不造成影响;
    (3) 无数据输入假定:无数据的独立性等假设;
  • 缺点
    (1) 计算复杂度高:因为要计算的点需要与所有点计算距离,所以复杂度很高;
    (2) 空间复杂度高:因为需要加载所有的样本;

适应的数据范围

  • 数值型和标称型(是或者否)

算法原理

knn的优缺点 knn算法的优点有_knn的优缺点


K值选择

  • 如果选择较小的K值
    – 近似误差会减小(针对训练集),估计误差会增大(针对测试集或验证集);
    – 对噪声比较敏感;
    – 容易过拟合(模型复杂),泛化能力差;
  • 如果选择较大的K值
    – 近似误差增大,估计误差会减小;
    – 整体模型变得简单;

距离选择

  • 欧式距离:对异常值更敏感
  • 曼哈顿距离
  • 马氏距离:可以消除样本间的相关性,协方差矩阵可以降低样本差异性;

算法改进

  • KD树
    – 对K维空间的实例点进行存储以便快速检索;
    – 是二叉树,相当于不断用垂直与坐标轴的超平面将K维空间切分构成一系列K维超矩形区域;
  • 例子

    以中值作为切割点,对x轴从小到大排序
    (2,3), (4,7), (5,4), (7,2), (8,1), (9,6) 此时x轴的中值位置为(7,2);(2,3), (4,7), (5,4)作为左节点,(8,1), (9,4)作为右节点,分别对y轴切分;
  • 最终树结构如下:
  • kd树查找(假设查找(2,4.5)节点)
    通过KD树,找到最后一个叶子节点为(4,7),与目标查找点的距离为3.202;回溯到根节点(5,4),计算其与查找点之间的距离为3.041,小于3.202,所以“当前最近邻点”变成(5,4);
    以目标点(2,4.5)为圆心,以目标点(2,4.5)到“当前最近邻点”(5,4)的距离(即3.041)为半径作圆,如上图所示。可见该圆和y = 4超平面相交,所以需要进入(5,4)左子空间进行查找,即回溯至(2,3)叶子节点;
    (2,3)距离(2,4.5)比(5,4)要近,所以“当前最近邻点”更新为(2,3),最近距离更新为1.5;
    再回溯到(7,2),以(2, 4.5)为圆心,以1.5为半径的圆不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。
  • kd树缺点:
    在kd tree 中,我们看到一个导致性能下降的最核心因素是因为kd树的平面是一个个的方形,求最近邻时使用的是圆形。方形平面跟圆形相交的可能性是极高的,如果方形的交汇点多的话,圆形和几个平面相交的可能性就变得更大。这样,凡是相交的平面,都需要进行检查,大大的降低运行效率。在维度较高时,这种性能降低十分明显。
  • ball tree特点
    ball tree抛弃了kd树画的方形,而建立球形,去掉棱角。简而言之,就是使用超球面而不是超矩形划分区域。
  • ball tree的构造方式
    所有的数据先构成一个最大的球体。从球中选择一个离球的中心最远的点,然后选择第二个点离第一个点最远。将圆中所有离这两个点最近的观测点都赋给这两个簇的中心,而后计算每一个簇的中心点和包含所有其所属观测点的最小半径。不断递归得到最终结果如上图C所示。在上图B中所示数据结构中A,B,C , D, E非叶子节点存储了球的中心点和半径。
  • ball tree查找方式
    先寻找叶子节点,并计算叶子节点和目标点的距离,此值确定目标最小距离上限。根据构造方式可知,可以根据目标点计算出其叶子节点。此时,唯一需要验证的是其兄弟节点的距离,如果小于上限就更新最近目标点。
  • 外部库使用(sklearn)