(Python机器学习)手动实现iris数据集knn分类

Python手写iris数据集knn分类器

knn分类

KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,主要原理是通过计算待测试样本到所有的训练样本之间的距离,找到离测试样本最近的k个训练样本,之后将测试样本的类别分为最近的k个训练样本中类别标号最多的一类,原理相对简单。利用python中的numpy.array进行矩阵运算来计算距离。

对sklearn库中自带的iris数据集进行knn分类,划分30%的样例为测试集,计算每一个测试集样例到所有训练集样例的欧氏距离,选取距离最小的k个训练样例取得它们的类别标签,统计其中出现最多的类别标签,查看其与测试集样例原本的类别标签是否相同,最后输出测试集分类准确率

import numpy as np
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
#从sklearn的datasets中读取iris数据集

k=5   #定义k值
right=0

sc = StandardScaler()
sc.fit(iris.data)
sdata = sc.transform(iris.data)
# 数据标准化,将特征值减去平均值再除以极差

index=np.arange(150)
np.random.shuffle(index)
traindata,trainlabel,testdata,testlabel=iris.data[index[:105]],iris.target[index[:105]],iris.data[index[:45]],iris.target[index[:45]]
#随机选取105个样本做训练集,45个样本做测试集

for n,l in enumerate(testdata):      #对测试集每一个样例进行分类  
    m = np.square(traindata-l)       #与训练集每一个样例的特征计算差值然后平方
    dis = np.sqrt(m.sum(axis=1))     #特征差值平方加和后再开方
    dis = np.c_[dis,trainlabel]      #将距离与类别进行连接,方便排序
    dis = dis[np.argsort(dis[:,0])]  #按照距离大小进行排序
    a = [i[1] for i in dis[:k]]      #选取距离最近的k个类别
    tag = max(a, key=a.count)          #得到k个类别中最多的类
    if tag==testlabel[n]:
        right+=1                     #如果与测试集原本的类别相同,right加一   

print('测试集精度为%.2f%%'%(right/len(testdata)*100))    #输出测试集分类准确率

测试集准确率为97.78%

'''
使用sklearn中的KNeighborsClassifier对数据集进行knn分类
'''

import numpy as np
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
#读取数据

sc = StandardScaler()
sc.fit(iris.data)
sdata = sc.transform(iris.data)
# 数据标准化,将特征值减去平均值再除以极差

traindata, testdata, trainlabel, testlabel=train_test_split(iris.data, iris.target, 
                                                            test_size=0.3,             #测试集占比为30%
                                                            #random_state=0,            随机数种子
                                                            #stratify=iris.target       保留原数据集比例   
                                                            ) 

knn = KNeighborsClassifier(n_neighbors=3)         
knn.fit(traindata,trainlabel)
predict = knn.predict(testdata)
print('分类准确率:')
print(knn.score(testdata,testlabel))

分类准确率:
0.9777777777777777

你可能感兴趣的:((Python机器学习)手动实现iris数据集knn分类)