• 机器学习——KNN算法


      近邻算法(KNN)属于有监督学习的聚类算法,他可以通过测量不同特征值之间的距离进行分类,一个样本在特征空间中的k个最相似的样本大多数属于某一个类别,则该样本也属于这个类别,算法中所选择的邻居都是正确分类的对象。KNN算法测距离依旧使用的是欧式距离。

      算法描述:

      计算测试数据与各个训练数据之间的距离;

      按照距离的递增关系进行排序;

      选取距离最小的K个点;

      确定前K个点所在的类别的出现频率;

      返回前K个点出现频率最高的类别作为测试数据的预测分类。

    Python中的实现

    以鸢尾花为例

    import numpy as np
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.datasets import load_iris
    
    if __name__ == '__main__':
        datas=load_iris()
        print(datas)
        #准备一个乱数的下标序列号
        index=np.arange(150)
        np.random.shuffle(index)
        #根据给定的乱序的下标到对应的数组中提取对应的数据
        train,test=datas.data[index[:100]],datas.data[index[100:]] #训练集和测试集
        train_target,real_target=datas.target[index[:100]],datas.target[index[100:]]
        #训练模型
        knn=KNeighborsClassifier(n_neighbors=5)
        knn.fit(train,train_target)
        #模型评估
        res=knn.predict(test)
        print(res)
        print('-------------------')
        print(real_target)
        print('--------------')
        print(1-abs(res-real_target).sum()/len(res))

    通过对比预测值res和实际值,可以得到准确度为:0.98

    而K值是自己定的,而不能确定是否是最优的情况,可以使用matplotlib进行作图调优,给定K的范围为(1,33)

    import numpy as np
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.datasets import load_iris
    from sklearn.model_selection import  cross_val_score
    import matplotlib
    import matplotlib.pyplot as plt
    
    if __name__ == '__main__':
        matplotlib.rcParams['font.sans-serif'] = ['SimHei']
        datas=load_iris()
        train,target=datas.data,datas.target
        neigh=np.arange(1,33)
        y=[]
        for i in neigh:
            knn=KNeighborsClassifier(n_neighbors=i)
            #cross_val_score 交叉验证模型 提高精确度
            ms=cross_val_score(knn,train,target,cv=10,scoring='accuracy').mean()    #平均值
            y.append(ms)
        plt.plot(neigh,y,'r')
        for x1,y1 in zip(neigh,y):
            plt.text(x1,y1,str(x1),ha='center',va='bottom',fontsize=12,rotation=0)
        plt.show()

    得到一个精确度的折线图如下,由图选取最佳的K值再参与计算,提高KNN算法的准确性。

  • 相关阅读:
    从构建分布式秒杀系统聊聊限流特技
    轻快的VIM(三):删除
    shell中各种括号的作用()、(())、[]、[[]]、{}
    java的重写规则
    UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数
    linux下使用 du查看某个文件或目录占用磁盘空间的大小
    linux如何查看系统占用磁盘空间最大的文件及让文件按大小排序
    管道命令和xargs的区别(经典解释)
    JAVA 一个或多个空格分割字符串
    shell替换一个或多个空格为逗号
  • 原文地址:https://www.cnblogs.com/afeiiii/p/13941726.html
Copyright © 2020-2023  润新知