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]]

总结:

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

posted @ 2020-04-09 10:00  超级无敌57  阅读(912)  评论(0编辑  收藏  举报