• k近邻法(KNN)知识点概括


    分类一般分为两种:

      积极学习法:先根据训练集构造模型,然后根据模型对测试集分类

      消极学习法:推迟建模,先简单存储训练集,等到给定测试集时再进行建模,如KNN算法。

    1. 简述

      KNN的核心思想就是:物以类聚,人以群分

      即给定一个训练数据集,对于新的输入实例,在训练集中找到与该实例最邻近的K个实例,这K个实例多数属于某个类,就把该输入实例分为这个类

    2. K值的选择

      若K值较小,相当于用较小邻域的实例进行预测,近似误差减小,估计误差增大,对邻近的实例点敏感,若邻近点恰好是噪声点,则预测出错。总之,K值减小,模型复杂,易过拟合(已知数据预测很好,未知数据预测差)

      若K值较大,相当于用较大邻域的实例进行预测,近似误差增大,估计误差减小,较远的实例点(可能为不相似点)也会参与预测,使预测出错。总之,K值增大,模型变简单

      若K=N,简单地预测为训练集中最多的类,模型过于简单,忽略大量有用信息

      所以,K值一般靠经验,或采用交叉验证法选取最优K值,就是初始取个较小值,之后再不断调整来达到最优,但这个K值也只是对这个样本集是最优的,一般采用k为奇数,避免产生票数相等的情况难以抉择

    3.距离度量

      这是指如何选取邻居的问题,即邻居间的相似度的度量方式

      欧氏距离、曼哈顿距离(L1距离、城市区距离)、切比雪夫距离(各个坐标距离的最大值)分别为闵可夫斯基距离在p=2/1/∞的特殊情况,分别应用于空间、距离、国际象棋比赛上

      另外,还有标准化欧氏距离(后=(前-均值)/ 方差),马氏距离,巴氏距离,汉明距离(两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数),夹角余弦(向量),jaccard系数(集合),皮尔逊系数PCC(变量的相关性)

    4 改进

      如何寻找邻居?

      最简单的方法就是对整个样本集逐一计算距离,全部存储,再进行查找

      改进方案有两种,一是对样本进行组织与整理,分群分层 ,压缩到接近测试样本领域的小范围内(KD树)。另一个就是在原有样本集中挑选出对分类计算有效的样本,减少样本数,从而减少计算与存储(压缩近邻算法)。

    压缩近邻法

      首先定义两个存储器,一个用来存放即将生成的样本集,称为Store;另一存储器则存放原样本集,称为Grabbag。其算法是:

        1.   初始化。Store是空集,原样本集存入Grabbag;从Grabbag中任意选择一样本放入Store中作为新样本集的第一个样本。

        2.   样本集生成。在Grabbag中取出第i个样本用Store中的当前样本集按最近邻法分类。若分类错误,则将该样本从Grabbag转入Store中,若分类正确,则将该样本放回Grabbag中。

        3.   结束过程。若Grabbag中所有样本在执行第二步时没有发生转入Store的现象,或Grabbag已成空集,则算法终止,否则转入第二步。 

    5.分类决策规则

      多数表决规则,即经验风险最小化

      也可以为每个邻居赋予一定的投票权重,通过它们与测试数据的远近来分配相应的投票权重(例如距离的倒数1/d2

    matlab代码:https://github.com/yundou2017/knn_self.git

  • 相关阅读:
    LeetCode 297. Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化(C++/Java)
    LeetCode 381. Insert Delete GetRandom O(1)
    LeetCode 380. Insert Delete GetRandom O(1) 常数时间插入、删除和获取随机元素(C++/Java)
    LeetCode 673. Number of Longest Increasing Subsequence 最长递增子序列的个数 (C++/Java)
    LeetCode 675. Cut Off Trees for Golf Event 为高尔夫比赛砍树 (C++/Java)
    LeetCode 460. LFU Cache LFU缓存 (C++/Java)
    LeetCode 451. Sort Characters By Frequency 根据字符出现频率排序 (C++/Java)
    LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)
    LeetCode 295. Find Median from Data Stream数据流的中位数 (C++/Java)
    Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)
  • 原文地址:https://www.cnblogs.com/xiaoyun94/p/6726786.html
Copyright © 2020-2023  润新知