作者:張張張張
github地址:https://github.com/zhanghekai
【转载请注明出处,谢谢!】
【机器学习系列】之k近邻(kNN)
【机器学习系列之】纯python及sklearn实现kNN
一、 k N N kNN kNN优缺点
2.1 k N N kNN kNN的主要优点:
- 理论成熟,思想简单,既可以用来做分类也可以用来做回归
- 可用于非线性分类
- 训练时间复杂度比支持向量机之类的算法低,仅为 O ( n ) O(n) O(n)
- 和朴素贝叶斯之类的算法比,对数据没有假设,准确率更高,对异常点不敏感
- 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别,因此对于类域的交叉或重叠较多的待分类样本集来说,KNN方法比其他方法更合适。
- 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域才用这种算法容易产生误分
2.2 k N N kNN kNN的主要缺点:
- 计算量大,尤其是特征数非常多的时候
- 样本不平衡的时候,对西游类别的预测准确率低
- KD树、球树之类的墨西哥建立需要大量的内存
- 使用懒散学习方法,基本上不学习,导致预测时速度比逻辑回归之类的算法慢
- 相比决策树模型,KNN模型可解释性不强
二、 k N N kNN kNN概述
k k k近邻(简称 k N N kNN kNN)学习是一种常用的监督学习方法!其工作机制非常简单: 给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这 k k k个“邻居”的信息来进行预测。
k N N kNN kNN既可以做分类,也可以做回归:
- 在分类任务中可使用“投票法”,即选择这 k k k个样本中出现最多的类别标记作为预测结果。
- 在回归任务中可使用“平均法”,即将这 k k k个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行甲醛平均或加权投票,距离越近的样本权重越大。
k N N kNN kNN特点: k k k近邻学习有一个明显的不同之处:它似乎没有显式的训练过程!它是 “懒惰学习(lazy learing)” 的著名代表,此类学习技术在训练结点仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理。相应的,那些在训练阶段就对样本进行学习处理的方法,称为 “急切学习(eager learning)”。
三、 k N N kNN kNN三要素
3.1 k k k值的选择
对于 k k k值的选择,没有一个固定的经验,一般根据样本分布,选择一个较小的值,可以通过交叉验证选择一个合适的 k k k值。
- 选择较小的 k k k值: 相当于用较小的领域中的训练实例进行预测,训练误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是泛化误差会增大,即: k k k值的减小就意味着整体模型变得复杂,容易发生过拟合。
- 选择较大的 k k k值: 相当于用较大领域中的训练实例进行预测,其优点是可以减少泛化误差,但缺点是训练误差会增大。此时,与输入实例较远(不相似)的训练实例也会对预测起作用,使预测发生错误,且 k k k值的增大就意味着整体模型变得简单。
例: 暂且假设距离计算使恰当的,当 k = 1 k=1 k=1时在二分类问题上的分类器示意图如下。
3.2 距离的度量方式
- 欧氏距离:
D ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 D(x, y)=\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+\cdots+(x_n-y_n)^2}=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} D(x,y)=(x1−y1)2+(x2−y2)2+⋯+(xn−yn)2