k-近邻算法学习笔记
基本概念
k-近邻算法(K-Nearest Neighbor,KNN),是机器学习分类算法中最简单的一类。采用测量不同特征之间距离方法进行分类。通俗地说所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近k个邻居来代表。就比如,判断一个人的人品,只需要观察与他来往最密切的几个人的人品好坏就可以得出,即“近朱者赤,近墨者黑”;KNN算法既可以用于分类,又可以用于回归中。
KNN在做回归和分类的主要区别在于最后做预测的时候的决策方式不同。KNN在分类预测时,一般采用多数表决法;而在做预测时,一般采用平均值法。
KNN算法原理
1.从训练数据集合中获取K个离待预测样本距离最近的样本数据;
2.根据获取得到的K个样本数据来预测当前待预测样本的目标属性值。
如下图绿色圆是要被决定赋予哪个类,
如果K=3,由于红色三角形所占比例为2/3,绿色圆就被认为是红色三角形类;
如果K=5,由于蓝色正方形所占比例为3/5,蓝色圆就被认为是蓝色正方形类。
在理想情况下,K值选择为1,即值选择最近邻居。在现实生活中往往没有这么理想,比如对于价格来说,有些孤噩消息闭塞,可以回为“最近邻居”多付很多钱,所以应当货币三家,多选一些邻居,取均值来减少噪声。实际上,K值过大过小都会影响最终结果。
KNN三要素
1.K值的选择:对于K值,一般根据样本数据选择一个较小的值,然后通过交叉验证来选择一个比较合适的最终值;当选择比较小的K值的时候,表示使用较小领域的样本进行预测,训练误差会减小,但是会导致模型变得复杂,容易过拟合;当选择较大的K值的时候,表示使用较大领域中的样本进行预测,训练误差会增大,同时会使模型变得简单,容易导致欠拟合。
2.距离的度量:一般使用欧式距离(欧几里得距离)
(欧式距离:一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。在二维和三维空间中就是两个点之间的距离)
3.决策树规则:在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法。
KNN分类预测规则
KNN在分类应用中,一般采用多数表决法或者加权多数表决法。
多数表决法:每个邻近样本的权重一样的,也就是说最终预测的结果为出现类别最多的那个类,比如下图中蓝色最终类别为红色;
加权多数表决法:每个邻近样本的权重是不一样的,一般情况下采用权重和距离成反比的方式来计算,也就是说最终预测结果是出现权重最大的那个类别。比如下图中,假设三个红色点到待预测样本的距离为2,两个黄色点到待预测样本点距离为1,那么蓝色圆最终的类别是黄色。
KNN回归预测规则
在KNN回归应用中,一般采用平均值法,或是加权平均值法。
平均值法:每个邻近样本的权重是一样的,也就是说最终预测的结果为所有邻近样本的目标值;比如下图中,蓝色圆圈的最终预测值为:2.6
加权平均值法:每个邻近样本的权重是不一样的,一般情况下采用权重和距离惩罚比的方式计算也就是数在计算均值的时候进行加权操作;比如下图假设上面三个点到待预测样本点的距离均为2,下面两个点到待预测样本点距离为1,那么蓝色圆圈的最终预测值为:2.43(权重分别为:1/7和2/7)
KNN算法实现方式
KNN算法的重点在于找出k个最邻近的点,主要方式有以下几种:
蛮力实现(brute):计算预测样本到所有训练集样本的距离,然后选择最小的K个距离即可得到k个最近邻点。缺点在于当特征数比较多、样本数比较多的时候,算法 的执行效率比较低。
KD树(kd_tree):KD树算法中,首先是对训练数据进行建模,构建KD树,然后在根据建好的模型来获取邻近样本的数据。
KD Tree构建方式
KD数采用从m个样本的n维特征中,分别计算n个特征取值的方差,用方差最大的第K维特征nk作为根节点。对于这个特征,选择取值的中位数bkv作为样本的划分点,对于小于该值的样本划分到左子树,对于大于等于该值的样本划分到右子树,对于左右子树采用同样的方式找方差最大的特征作为根节点,递归即可产生KD树。
KD tree 查找最近邻
当欧我们生成KD树以后,就可以去预测测试集里面的样本目标点了。对于一个目标点,我们首先在KD树里面找到包含目标点的叶子节点。以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体的内部。然后返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有的化就更新最近邻。如果不相交那就简单了,我们直接返回父节点的父节点,在另一个子树继续搜索最近邻。当回溯到根节点时,算法结束,此时保存的最近邻点就是最终的最近邻。