机器学习——KNN最近邻算法

K近邻(K Nearest Neighbor,KNN),可以做分类,也可以做回归。

 

一、基本思想

给定一组训练集,有一个需要判断类别的输入实例,离输入实例最近的K个训练数据属于哪个类别,就判断输入实例属于哪个类别。

 

二、分类算法描述:

1、计算输入实例和所有训练集数据的距离;

2、按距离升序排序;

3、选择排序后的前K个训练子集数据;

4、根据选择出来的K个训练子集数据的类别,使用判别规则(一般是多数投票),预测输入实例的类别。

       这样实现也叫蛮力算法,适合样本量少的时候使用。

 

 

三、影响因素:

根据以上描述,我们可以归纳影响KNN的主要因素:1、距离的度量 2、K值 3、判别规则。下面具体说下这3个因素是怎么影响KNN的。

 

  1. 距离的度量

计算2个n维数据点的距离公式,闵可夫斯基距离是最一般的形式:

其中,l 是数据点的特征,因为数据点是n维的,所以l 能从1取到n,数据点xixj 之间的距离就等于,xi 和 xj 每个特征相减的绝对值的p次方,求和后开 p次根号。

一般,p 取1、2、∞。

P = 1,叫曼哈顿距离。

P = 2,叫欧式距离。

P = ∞,切比雪夫距离,注意一点的是这个距离的含义,他表示特征差的最大值,不再是所有特征差,只取最大的那个。至于为什么是这样,我还没搞懂。

当然还有更多的求距离的公式,以后学了再添加。

 

值域变化大的特征会对距离产生较大的影响,因此为了避免这种情况,需要对训练数据做归一化,缩小特征的值域范围。

 

  1. K值

K值过小过大都不好。

K值过小,邻域小,预测结果对邻域里的训练数据非常敏感,容易造成过拟合。

K值过大,邻域大,距离远的训练数据也会对预测结果产生影响,极端值会影响预测结果。

 

如何选择合适的K值呢?通常使用交叉验证。这个我还没有深入了解。

 

  1. 决策规则

目前只见过一种投票,也叫多数表决。表达式:

这个表达式含义:邻域中类别最多的类。或者是:

含义:邻域中不等于类别的最小占比,也叫损失,找最小损失。

 

上面2个表达式归根到底是一个意思,就是找邻域中类别最多的类别,该类别就是预测的结果。前面考虑的是距离近和距离远的点对预测结果产生一样的影响,我们想想,距离近和远应该是一样的影响程度吗?肯定不一样。那怎么合理解决呢?用加权投票,给距离近的点更大的权重,距离远的点更小的权重,这样预测的结果会更合理一些。

 做加权,距离加权表决表达为:

 

 

 

四、优缺点

到这里,归纳下KNN的优缺点:

优点:思想简单,理论成熟,既可以用来做分类又可以用来做回归,

准确度高,对数据没有假设,对离群值不敏感,

缺点:计算量大,需要大量内存,

         样本不平衡问题(有些类别样本特别多,有些类别样本很少)

 

五、KD树

KNN没有显式模型,每一次预测都要用训练数据计算一遍,如果训练数据体量大的话,会比较慢。一种优化效率的方法,是把训练数据保存成KD树。

 

1、KD树的构建

       根节点用方差最大的特征。找到特征的中位数,小于中位数的划入左子树,大于中位数的划入右子树,对于左右子树,再选取方差最大的特征当作节点,递归产生KD子树。划分出来的形状是超矩形。

 

2、KD树的搜索

       首先找到包含目标点的叶子结点,以目标点到叶子结点的距离为半径,作超球体,最邻点一定在这个超球体内。然后返回父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交,就到这个子节点寻找是否有最邻点,有的话更新最邻点。如果不相交,就返回父节点的父节点,在另一个子树里搜索最邻点。当回到根节点时,算法结束,此时最邻点就是最终的最邻点。

 

  1. KD树预测

搜索到第一个最近邻,然后依次剩余K-1个最近邻(已选的数据点要删除不能再选)。如果是分类,就用投票法选择类别,如果是回归,就用平均值作为预测结果。

 

六、优化

分组快速搜索近邻法

       把训练集按近邻关系分成组,给出每组质心的位置,以质心作为代表点,计算和输入实例的距离,选出距离最近的一个或若干个组,再在组内应用KNN。由于并不是计算输入实例与所有训练集数据的距离,故该改进算法可以减少计算量,但并不能减少存储量。

 

发布了34 篇原创文章 · 获赞 4 · 访问量 3367

猜你喜欢

转载自blog.csdn.net/lvhuike/article/details/103484658