K近邻--KNN

K近邻--KNN

KNN算法

KNN是选择距离最近的几个样本,做分类或者回归。分类时,选择多数表决法,回归时,一般选择平均值法。

  1. KNN三要素

    1)K的选择:可通过交叉验证法寻找合适的K

    2)距离度量:

    对于两个n维向量x和y,两者的欧式距离、曼哈顿距离和闵可斯基距离定义如下:

    \[D(x,y)=\sqrt{(x_1-y1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}=\sqrt{\sum_{i=1}^n(x_i-y_i)^2}\qquad欧式距离\\ D(x,y)=\lvert x_1-y_1\rvert+\lvert x_2-y_2\rvert+...+\lvert x_n-y_n\rvert=\sum_{i=1}^n\lvert x_i-y_i\rvert\qquad曼哈顿距离\\ D(x,y)=\sqrt[p]{(|x_1-y1|)^p+(|x_2-y_2|)^p+...+(|x_n-y_n|)^p}=\sqrt[p]{\sum_{i=1}^n(|x_i-y_i|)^p}\qquad闵可斯基距离 \]

    3)分类决策规则:一般使用多数表决法

  2. KNN算法的实现

    如果使用爆力求解的方式,要计算目标与每个样本的距离,代价是非常大的。所以采用KD树、球树的方式实现。

    1)KD树,就是K个特征的树,先对训练集进行建模,从n个特征中取方差最大的k个作为根节点,取中位数作为样本划分点,递归此过程,直到结束。

    2)球树(略)

KNN总结

KNN优点:

  1. 理论成熟,思想简单,可做分类和回归
  2. 可用于非线性分类
  3. 训练时间复杂度比SVM算法低,仅为O(n)
  4. 与朴素贝叶斯比,对数据没有假设,准确率高,对异常点不敏感
  5. 对类域的交叉或重叠较多的样本,KNN也比较适合
  6. 比较适用于样本容量比较大的类域

KNN缺点:

  1. 计算量大
  2. 样本不平衡时,准确率低
  3. KD树、球树需要大量内存
  4. 基本不学习,预测速度慢
  5. 可解释性不强

scikit-learn K近邻算法库

  1. 相关类库

    主要的类在sklearn.neighbors包中,KNeighborsClassfier分类和KNeighborsRegressor回归

  2. 主要参数

    1)n_neighbors:选择的K值

    2)weights:近邻样本权重

    3)metric:距离度量

  3. 实现例子

    from sklearn.neighbors import KNeighborsClassifier
    clf = KNeighborsClassifier(n_neighbors=15, weights='distance')
    clf.fit(X,y)
    
posted @ 2020-05-13 15:37  hi_heisen  阅读(149)  评论(0)    收藏  举报