机器学习算法——KNN

来源:互联网 发布:vr unity3d 比ue4清晰 编辑:程序博客网 时间:2024/06/18 13:16

Introduction

学完python基本用法、numpy、pandas等数据分析库、机器学习应用的基本流程,kaggle竞赛的简单实践之后,下一步计划系统学学机器学习算法。一方面,理解算法中超参数的含义和理解他们是如何影响模型性能,在模型调优的过程中可以手动调节;另一方面,理解每种算法的应用范围和他们的优缺点等,在选择算法时不再盲目。同时,加深自己理论推导能力和抽象概念理解能力,进一步,提高编程算法实现能力等。最终,面试过程中底气更足一点吧。

结合之前的内容,先从最陌生的看k近邻算法开始。

Method

k近邻算即K-Nearest Neighbor algorithm,简称KNN算法,是一种有监督算法而非k-means,可以进行分类和回归。


优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高

适应数据范围:数值型和标称型


什么是KNN

基本思想:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。


  • 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

    于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。


k近邻模型三要素

距离度量

参考:从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

总结:各种“距离”的应用场景简单概括为:

        空间:欧氏距离;

        路径:曼哈顿距离;

        国际象棋国王:切比雪夫距离。

        以上三种的统一形式:闵可夫斯基距离。

        加权:标准化欧氏距离;

        排除量纲和依存:马氏距离;

        向量差距:夹角余弦;

        编码差别:汉明距离;

        集合近似度:杰卡德类似系数与距离;

        相关:相关系数与相关距离。

注意点:由不同距离度量所确定的最近邻是不同的。

           两实例点的距离是两个实例点相似程度的反映。

k值的选择(超参数)

  1. (近朱者赤近墨者黑)如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,因为邻近的实例点如果是噪声,预测就会出错。换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
  2. (墙头草,风往哪边刮就往哪边倒)如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
  3. K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的累,模型过于简单,忽略了训练实例中大量有用信息。
    在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值

分类决策规则
多数表决

K近邻算法的实现:KD树

KNN不具有显式的学习过程,是通过计算输入实例与每一个训练实例的距离并通过多数表决进行预测。在大规模数据中使用特殊数据结构,减少距离计算次数,即树形结构的搜索算法。
KD树的构建、插入、删除、搜索等理论知识及其代码实现,参考
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

sklearn实现KNN分类

KNeighborsRegressor和RadiusNeighborsRegressor

X = [[0], [1], [2], [3]]y = [0, 0, 1, 1]from sklearn.neighbors import KNeighborsClassifierneigh = KNeighborsClassifier(n_neighbors=3)neigh.fit(X, y) KNeighborsClassifier(...)print(neigh.predict([[1.1]]))[0]print(neigh.predict_proba([[0.9]]))[[ 0.66666667  0.33333333]]

参考资料:
从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
李航:《统计学习方法》
sklearn——Nearest Neighbors




原创粉丝点击