美文网首页
KNN是什么东东?

KNN是什么东东?

作者: 一只怂货小脑斧 | 来源:发表于2020-08-27 14:25 被阅读0次

    小白自学路上的备忘记录。。。


    一、KNN

    KNN(K-Nearest Neighbor)K-近邻算法,是一种最简单常用的监督学习算法,属于“懒惰学习”,即在训练阶段仅仅是把样本保存起来,训练时间开销为0,待收到测试样本后再进行处理。而那些在训练阶段就对样本进行学习处理的方法,称为“急切学习”。

    懒惰学习是一种训练集处理方法,其会在收到测试样本的同时进行训练,与之相对的是急切学习,其会在训练阶段开始对样本进行学习处理。

    若任务数据更替频繁,则可采用懒惰学习方式,先不进行任何训练,收到预测请求后再根据当前数据进行概率估值;若数据不断增加,则可在现有估值基础上,仅对新增样本的属性值进行 增量学习 ,其只需对相关概率估值进行技术修正即可

    https://hyper.ai/wiki/4266

    二、模型原理

    为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。

    KNN 既然是K个近邻投票选择类别,那么就有两个问题:

    • 1.如何选出K个近邻

    在KNN中,具体执行步骤为:

    (1) 计算待测样本和训练集中每个样本点的距离

    ps.通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

    (2) 对上面的所有距离排序

    (3) 选前K 个最小距离的样本作为“选民”

    在 scikit-learn 中 KNN算法的 K 值是通过 n_neighbors 参数来调节的,默认值是 5

    K 值较大:距离较远的训练样本也可以对结果产生影响,模型鲁棒,误差大,欠拟合

    K值较小:在较小的近邻区域内训练,结果对近邻点十分敏感

    可通过交叉验证确定K值。

    • 2.如何“投票”,或者说,选票的权重是否相等

    在 KNN 算法中,所选择的邻居都是已经正确分类的对象,基本上邻居们是均匀权重投票,即一人一票,计数比较结果。 在 scikit-learn 中通过设置 weights 参数选择对应的权重算法。

    三、KNN的特点

    • 原理简单

    • 保存模型需要保存全部样本集

    • 训练过程很快,预测过程很慢

    四、KNN 的应用

    1.处理二分类问题

    2.处理多分类问题

    3.回归分析

    五、鸢尾花分类代码样例

    实现鸢尾花属性类别的分类器

    代码

    import numpy as np # 快速操作结构数组的工具
    import pandas as pd # 数据分析处理工具
    import matplotlib.pyplot as plt # 画图工具
    from sklearn import datasets # 机器学习库
    
    #数据集 0-setosa、1-versicolor、2-virginica
    scikit_iris = datasets.load_iris()
    # 转换成pandas的DataFrame数据格式,方便观察数据
    iris = pd.DataFrame(data=np.c_[scikit_iris['data'], scikit_iris['target']],
                         columns=np.append(scikit_iris.feature_names, ['y']))
    
    print(iris.head(2))
    
    # 检查数据是否有缺失
    print(iris.isnull().sum())
    
    # 观察样本中按类别数量是否比较均衡
    print(iris.groupby('y').count())
    
    # 选择全部特征训练模型
    X = iris[scikit_iris.feature_names]
    # label
    y = iris['y']
    
    # 第一步,选择model
    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=1)
    # 第二步,fit X、y
    knn.fit(X, y)
    # 第三步,predict新数据
    print(knn.predict([[3, 2, 2, 5]]))
    

    参考资料:

    https://blog.csdn.net/pengjunlee/article/details/82713047

    《机器学习之路》

    相关文章

      网友评论

          本文标题:KNN是什么东东?

          本文链接:https://www.haomeiwen.com/subject/hvgbjktx.html