您好, 欢迎访问小ben成长手册, 现在是2020年06月06日

小ben成长手册 欢迎光临  


  • 读者墙
  • 本站统计
  • 文章总数:488篇
  • 评论总数:951条
  • 分类总数:43个
  • 标签总数:451个
  • 友链总数:57个
  • 建站日期:2016-05-11
  • 站长推荐
  • 金银花

  • KNN算法的实现(python)
    作者: benen005 | 发布时间: 2020-05-09 16:22:08 | 点击量: 107
    标签: KNN,python

    python 就是这么简单的实现KNN算法

    import numpy as np
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report,confusion_matrix
    import operator
    import random
    def knn(x_test, x_data, y_data, k):
       x_data_size = x_data.shape[0] #x_data_size=110
       np.tile(x_test,(x_data_size,1)) #y轴复制110倍, (110,1), 为了计算的方便
       diffMat = np.tile(x_test, (x_data_size,1)) - x_data #4*110 的矩阵 相减
       sqDiffMat = diffMat**2 #4*110 的矩阵 差的平方
       sqDistances = sqDiffMat.sum(axis=1) #每一行向量相加, 得到 1*110 差的平方的和
       distances = sqDistances**0.5 #再开根号 1*110
       sortedDistances = distances.argsort() #再排序后输出排序后的index
       #print(sortedDistances)
       classCount={}
       for i in range(k):
           votelabel = y_data[sortedDistances[i]] #取得0 - 4 前5个的label
           classCount[votelabel]=classCount.get(votelabel,0)+1 #0 - 几个 1 - 几个 2 - 几个 变一个list
           
         
       sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #classCount 的第二个域 逆排序
       #print(sortedClassCount)
       
       return sortedClassCount[0][0]


    iris = datasets.load_iris() #取一个iris 4*150
    data_size=iris.data.shape[0]  #150
    index = [i for i in range(data_size)] #0 -> 149
    random.shuffle(index) # 打乱 0 - 149
    iris.data = iris.data[index] #打乱后的 iris.data
    iris.target = iris.target[index] #打乱后的 iris.target label值


    test_size = 40 #测试40个样本
    x_train = iris.data[test_size:] #后110为train
    x_test = iris.data[:test_size] #前40个为test
    y_train = iris.target[test_size:] #后110为trian label
    y_test = iris.target[:test_size] #前40个为test label

    predictions = [] #储存结果集,为一个列表
    for i in range(x_test.shape[0]):  #在40个test里
       predictions.append(knn(x_test[i],x_train,y_train,5)) #x_test[i]为第i组数据, x_train为训练集, y_train为训练label,k=5
    print(classification_report(y_test,predictions))

    r=[]
    print(len(y_test))

    for i in range(len(y_test)):
       r.append(y_test[i])
    print(r)
    print(predictions)
    print(confusion_matrix(y_test,predictions))



    名称(*)

    邮箱

    网址

    二十一加三等于几?

    (*)

    本站资源均来自网络,如有侵权请联系我们删除e-mail:benen005@sina.com