V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
magicalion
V2EX  ›  机器学习

机器学习分享 KNN 算法 及 numpy 实现

  •  
  •   magicalion · 2019-01-10 16:10:26 +08:00 · 2362 次点击
    这是一个创建于 1926 天前的主题,其中的信息可能已经有所发展或是发生改变。

    KNN 是一种非参数的懒惰的监督学习算法.

    非参数的意思是,模型不会对基础数据分布做出任何假设。换句话说,模型的结构是根据数据确定的。懒惰的意思是没有或者只有很少的训练过程.

    KNN 算法既可以处理分类问题,测试数据的类型由所有 K 个最近邻点投票决定,也可以处理回归问题,测试数据的值是所有 K 个最近邻点的值的均值或众数.

    KNN 的算法非常简单.

    例如,对于分类问题,算法流程如下,

    对需要预测的每个数据依次执行以下操作:

    1. 计算已知训练数据集中的点与当前点之间的距离;
    2. 按照距离递增次序排序;
    3. 选取与当前点距离最小的 k 个点;
    4. 确定前 k 个点所在类别的出现频率;
    5. 返回前 k 个点出现频率最高的类别作为当前点的预测分类。

    需要注意的是,要对数据进行特征缩放.下面两张图很好的阐释了缩放的重要性.

    image image

    那么 KNN 在实际使用中有哪些优点和缺点呢?

    它的优点有:

    • 可以处理线性和非线性数据
    • 直观上易于理解
    • 具有较高的准确率
    • 既可以用作回归问题,也可以用作分类问题

    它的缺点是

    • 计算代价大
    • 内存要求高
    • 数据量大时预测较慢
    • 对无关的特征以及特征缩放敏感

    在实际的使用过程中,可能会遇到如下的问题.

    1. k 近邻的类别出现了平局的情况. 例如在二分类中,正负类型的近邻数相同,使用奇数个近邻可以解决此问题,但是无法解决多分类的问题.这个时候可以
      • 随机决定属于哪个类别
      • 对某些类别设置优先级
      • 使用最近邻来做最终的决定

    2.训练数据的缺失值如何处理.如果不处理缺失值,则无法计算距离.对于缺失值的处理的核心原则是,尽可能小的影响距离的计算.一个合理的解决办法是,使用训练数据的平均值来填充缺失值.

    附上完整代码,登录之后就能查看了。 查看源码

    参考资料

    1. https://medium.com/@adi.bronshtein/a-quick-introduction-to-k-nearest-neighbors-algorithm-62214cea29c7
    2. https://www.youtube.com/watch?v=DRIoyIR8pA4
    3. https://www.datacamp.com/community/tutorials/k-nearest-neighbor-classification-scikit-learn
    4. https://stats.stackexchange.com/questions/287425/why-do-you-need-to-scale-data-in-knn
    1 条回复    2019-01-10 19:05:25 +08:00
    dezhou9
        1
    dezhou9  
       2019-01-10 19:05:25 +08:00 via Android
    knn 不是计算量小吗?谁总结的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   996 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:47 · PVG 06:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.