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值
#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个样本做测试集
result=np.zeros(testlabel.shape[0]) #保存结果
for n,l in enumerate(testdata):
dis=np.linalg.norm(traindata - l,axis=1)
a = trainlabel[np.argsort(dis)[:k]]
result[n] = max(a, key=list(a).count)
print('测试集准确率%.2f'%(list(result-testlabel).count(0)/len(testlabel)))
``
```python
'''
使用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('分类准确率:',knn.score(testdata,testlabel)