KNN(最近邻)分类算法

*爱你&永不变心* 提交于 2019-12-06 00:52:35

一、算法原理

KNN算法是机器学习中最基本算法之一,属于惰性学习算法的典例。惰性指模型仅通过对训练数据集的记忆功能进行预测,而不产生判别函数。

KNN算法本身很简单,归纳为如下几步:
①选择近邻数量k和距离度量的方法
②找到待分类样本的k个最近邻
③根据最近邻类标进行多数投票

二、超参数(结合sklearn.neighbors.KNeighborsClassifier)

2.1 n_neighbors(近邻个数, default = 5)

k近邻算法的k,近邻个数。

一般的根据经验k=5是最能得到最佳效果的点,但在实际开发过程中需要进行验证。

强调一点,如果在1到10中求得最佳k值为10,那么有必要对10以上的值选择区间再进行测试,因为可能含有效果更好的k值。

2.2 weights(距离权重, default = 'uniform')

基本的KNN算法仅仅通过找到待分类样本最近的k个样本进行多数投票,但可能存在如下情况:


 
 

如果按照投票的方式,应该分为蓝色类别,但从距离上看,样本距离红色类别更近,划为红色似乎更加合理,这里就需要引入距离权重的概念。
在KNeighborsClassifier中有一个参数weight,不指定该参数的情况下默认为uniform也就是多数投票,也可以指定weight为distance,即可采用距离权重的方式进行分类。

2.3 algorithm(求解算法, default='auto')

KNN算法复杂度较高,可以使用树结构优化,如KD-Tree、Ball-Tree等高效寻找近邻。

2.4 p(距离类型, default = 2)

分类时候使用的距离是什么距离?距离的种类有很多,最常见的有欧氏距离,此外还有曼哈顿距离。

 
 

如图给出的绿色的直线就是欧式距离,其他的线虽然走法不同但距离是一样的,都是曼哈顿距离。
当p为1时,等价于曼哈顿距离,p=2时等价于欧氏距离。当p>2时,基于minkowski距离计算。

三、 算法缺点

3.1 效率低下

假如一个数据集有m个样本n中特征,则预测一个样本的时间复杂度为O(mn),即需要和m个样本求距离并挑选前k个,每个特征维度都需要计算距离,故需要O(mn)。可以使用树结构优化,如KD-Tree、Ball-Tree等。

3.2 预测不具有可解释性

3.3 维数灾难

随着维数增加,看似很近的两个点距离越来越大。

 

参考资料:

https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!