K近邻--KNN
KNN算法
KNN是选择距离最近的几个样本,做分类或者回归。分类时,选择多数表决法,回归时,一般选择平均值法。
-
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 vert+lvert x_2-y_2 vert+...+lvert x_n-y_n vert=sum_{i=1}^nlvert x_i-y_i vertqquad曼哈顿距离\ 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)分类决策规则:一般使用多数表决法
-
KNN算法的实现
如果使用爆力求解的方式,要计算目标与每个样本的距离,代价是非常大的。所以采用KD树、球树的方式实现。
1)KD树,就是K个特征的树,先对训练集进行建模,从n个特征中取方差最大的k个作为根节点,取中位数作为样本划分点,递归此过程,直到结束。
2)球树(略)
KNN总结
KNN优点:
- 理论成熟,思想简单,可做分类和回归
- 可用于非线性分类
- 训练时间复杂度比SVM算法低,仅为O(n)
- 与朴素贝叶斯比,对数据没有假设,准确率高,对异常点不敏感
- 对类域的交叉或重叠较多的样本,KNN也比较适合
- 比较适用于样本容量比较大的类域
KNN缺点:
- 计算量大
- 样本不平衡时,准确率低
- KD树、球树需要大量内存
- 基本不学习,预测速度慢
- 可解释性不强
scikit-learn K近邻算法库
-
相关类库
主要的类在sklearn.neighbors包中,KNeighborsClassfier分类和KNeighborsRegressor回归
-
主要参数
1)n_neighbors:选择的K值
2)weights:近邻样本权重
3)metric:距离度量
-
实现例子
from sklearn.neighbors import KNeighborsClassifier clf = KNeighborsClassifier(n_neighbors=15, weights='distance') clf.fit(X,y)