本文用KNN算法实现对鸢尾花的分类识别,目的是了解KNN算法,以及其算法的简单应用。其在Jupyter中实现,并使用机器学习工具scikit-learn。
官网:https://scikit-learn.org
中文文档:Introduction · sklearn 中文文档
一、练习
安装 sklearn、matplotlib
pip install sklearn
pip install matplotlib
import matplotlib.pyplot as plt
import numpy as np
生成数据,make_blobs模块
from sklearn.datasets.samples_generator import make_blobs
#随意设置数据的中心
centers = [[-2,2],[2,2],[0,4]]
#围绕中心点产生 60个 数据,标准差为0.6
x,y = make_blobs(n_samples = 60, centers = centers, random_state = 0, cluster_std = 0.6)
查看生成数据
画图
plt.figure(figsize= (16,10),dpi =144) #画布大小
center_array = np.array(centers) #变换centers格式
plt.scatter(x[:,0],x[:,1],c = y ,s = 100, cmap='cool') #绘制散点
plt.scatter(center_array[:,0],center_array[:,1],s = 100,marker="^",c = "orange")
导入KNN分类器,并训练生成的数据(x,y)
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors = 5) #设置近邻点个数
clf.fit(x,y) #训练
选取样本点,并得到最近的几个点
x_sample = [[0,2]]
neighbors = clf.kneighbors(x_sample,return_distance = False)
print(neighbors[0])
#得到 [16 20 48 6 23]
画图
#设置画布
plt.figure(figsize=(16,10),dpi= 144)
#绘制生成点
plt.scatter(x[:,0],x[:,1],c=y, s=100, cmap='cool')
#绘制中心点 为三角形
plt.scatter(center_array[:,0], center_array[:,1],s = 100, marker = "^",c ="orange")
#绘制样本点
plt.scatter(x_sample[0][0],x_sample[0][1],marker="x", s = 100, cmap='cool')
#绘制近邻点到样本点的线段
for i in neighbors[0]:
plt.plot([x[i][0], x_sample[0][0]], [x[i][1], x_sample[0][1]], 'k--', linewidth = 0.6)
二、识别鸢尾花
导入数据集
from sklearn.datasets import load_iris
iris = load_iris()
iris_data = iris.data
#iris_data
iris_target = iris.target
#iris_target
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
把数据分组,训练占25%
x_train,x_test,y_train,y_test = train_test_split(iris_data, iris_target, test_size = 0.25)
fit_transform是fit和transform的组合,既包括了训练又包含了转换。fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
#算法
knn = KNeighborsClassifier(n_neighbors = 5)
#算法模型训练
knn.fit(x_train, y_train)
#预测结果
y_predict = knn.predict(x_test)
print(y_predict)
labels = ["山鸢尾","锦葵","变色鸢尾"]
for i in range(len(y_predict)):
print("第{}次预测,正确的是{}tt 预测的是{}".format(i+1, labels[y_predict[i]], labels[y_test[i]]))
print("准确率{}".format(knn.score(x_test, y_test)))
随着选取的紧邻点的个数不同,准确率有相应变化。
n_neighbors = 5 ,准确率0.8947368421052632
n_neighbors = 8 ,准确率0.9736842105263158
n_neighbors = 10 ,准确率0.9473684210526315