K Nearest Neighbor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31823267/article/details/89135583

项目地址:https://github.com/Daya-Jin/ML_for_learner/blob/master/neighbors/KNN.ipynb
原博客:https://daya-jin.github.io/2018/12/29/KNearestNeighbor/

模型结构

K近邻(K Nearest Neighbor)是一种基于存储的算法,该算法不需要拟合任何模型,给定一个需要判别的样本 x i x_{i} ,KNN算法会在数据库中搜索与 x i x_{i} 最近的数据或 k k 个最近的数据来判别 x i x_{i} 。特别地,当 k = 1 k=1 时,KNN就退化成最近邻(Nearest Neighbor)算法,也等同于原型方法,其中每一个样本点都是一个簇中心。由于KNN算法是基于距离的算法,因此影响该算法表现的至关重要的两点有:1. 距离度量的方法;2. 数据各特征的尺度差异。对于第二点,一般对数据进行Standardization变换,使得所有特征服从标准正态分布。可以证明(智商不够),最近邻算法的误差率近似不会超过贝叶斯误差的两倍。

当KNN应用于高维数据时,问题也随之而来。首先是随着维度的增加,数据点在空间的分布会很稀疏,“最近邻”的概念被淡化;另一个问题是应用最广泛的欧氏距离并不是一个通用的距离度量方法。考虑下图所示的情况:

图中黑点是需要预测的的点,长条区域表示的是只考虑 y y 轴距离的5个最近领样本,圆形区域表示的是考虑所有维度距离的5个最近领样本;前者正确分类,后者反而造成了误分类。要减缓这种问题也很简单,将 x x 轴的尺度放大或者将 y y 轴的尺度缩小即可。一般来说,我们会拉伸类分布概率变化不是很剧烈的那个轴。如上图的例子, x x 轴上的类分布概率是一个形如符号函数的分布,而在 y y 轴上的类分布概率则是随机的,那我们就拉伸 x x 轴。

实现指导

完整代码

KNN算法其实很简单,没什么好讲的,唯一值的一提的就是可优化的地方,用K-D树可以减少该算法的计算复杂度。

猜你喜欢

转载自blog.csdn.net/qq_31823267/article/details/89135583