• KNN-iris数据集实现


    前言:

    上篇介绍了knn的实现过程,这次我们使用库里自带的数据集来进行knn的实现。

    正文:

    import numpy as np
    #datasets里面自带数据集
    #本次使用的鸢尾花的数据就包含在其中
    #里面还有乳腺癌,波士顿房价等数据可供使用
    from sklearn import datasets
    #train_test_split函数将你传入的数据自动分为训练集和测试集
    from sklearn.model_selection import train_test_split
    #report用于计算f1等指标的值
    #confusion_matrix指混淆矩阵,行相加为真实值,列相加为分类值
    #具体可百度,空间有限不过多阐述
    from sklearn.metrics import classification_report,confusion_matrix
    #operaator里封装了一些数学函数供使用
    import operator
    import random
    
    def knn(x_test,x_data,y_data,k):
        #计算样本数量
        #准确来讲计算的是行数
        x_data_size = x_data.shape[0]
        #复制x_test
        np.tile(x_test,(x_data_size,1))
        #计算x_test与每一个样本的差值
        #这里tile函数之类的如果看不懂可以看我上一篇博客,写的很详细
        diffMat = np.tile(x_test,(x_data_size,1))-x_data
        #计算差值的平方
        sqDiffMat = diffMat**2
        #求和
        sqDistances = sqDiffMat.sum(axis=1)
        #开方
        distances = sqDistances**0.5
        #从大到小排序
        sortedDistances = distances.argsort()
        classCount = {}
        for i in range(k):
            #获取标签
            votelabel = y_data[sortedDistances[i]]
            #统计标签数量
            classCount[votelabel] = classCount.get(votelabel,0)+1
        #根据operator.itemgetter(1)-第一个值对classCount排序,然后再取倒序
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        #获取数量最多的标签
        return sortedClassCount[0][0]
    
    #载入数据
    iris = datasets.load_iris()
    #x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2)
    #上面意思是分割数据0.2为测试数据,0.8为训练数据
    
    #以下方法均是自主打乱数据的方法
    #打乱数据
    data_size = iris.data.shape[0]
    #生成一个列表List
    index = [i for i in range(data_size)]
    #把列表传进去之后shuffle函数自动帮我们打乱它
    random.shuffle(index)
    iris.data = iris.data[index]
    iris.target = iris.target[index]
    
    #切分数据集
    test_size = 40
    x_train = iris.data[test_size:]
    x_test = iris.data[:test_size]
    y_train = iris.target[test_size:]
    y_test = iris.target[:test_size]
    
    predictions=[]
    for i in range(x_test.shape[0]):
        predictions.append(knn(x_test[i],x_train,y_train,5))
    
    print(classification_report(y_test,predictions))
    

    各类参数如下:

             precision    recall  f1-score   support
    
          0       1.00      1.00      1.00        20
          1       1.00      0.83      0.91        12
          2       0.80      1.00      0.89         8
    

    avg / total 0.96 0.95 0.95 40

    print(confusion_matrix(y_test,predictions))
    #可以看出第二行有两个数据分类错了,knn算法的预测较为准确
    #这里多阐述一下
    #正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面。
    

    [[20 0 0]
    [ 0 10 2]
    [ 0 0 8]]

    总结:

    这个算法挺有意思的,可以帮你解决一些分类问题,效率也还不错。
    具体实现流程看上一篇博客会详细些。
    公式依旧是欧式距离。
    想开学啊,想吃火锅了。

  • 相关阅读:
    C# NAudio 变声
    初探Protostuff的使用
    CentOS7 配置阿里云yum源,非常之简单
    javacv 视频增加视频(画中画)
    抓包调试fiddler
    CentOS7 手动编译升级GCC至9.3.0
    C# CefSharp 新版本(83 以后版本) 如何在js中直接调用c#类
    毕业设计——驾驶证理论考试系统的设计与实现 2022年1月2日20:35:14
    送餐机器人乐动雷达记录
    linux下拉取git代码
  • 原文地址:https://www.cnblogs.com/lqk0216/p/12664887.html
Copyright © 2020-2023  润新知