函数进行优化 用es算法对_机器学习-用KNN算法进行图像分类识别

e42c9dea18d20fc2f1bbf131e9cff50b.png

本文用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)

查看生成数据

ca1af1db5c4bd0725afb56dad0083640.png

画图

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")

b64dd39b33a8db17f235f9b765777f0c.png

导入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)

2d5a9b51dad2280d01a91713976cde2f.png

二、识别鸢尾花

导入数据集

from sklearn.datasets import load_iris
iris = load_iris()
iris_data = iris.data
#iris_data
iris_target = iris.target
#iris_target

2c7cb185019895a224f420f2488ed08f.png

bd061c69988c4176019c155a5cae32f6.png
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)

96fabe971352718c47c089cd595cb0fa.png
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)))

503238688bbc65c37397a63eca0aba3f.png

5b657aaec951be22459847c3ca43659b.png

随着选取的紧邻点的个数不同,准确率有相应变化。

n_neighbors = 5 ,准确率0.8947368421052632

n_neighbors = 8 ,准确率0.9736842105263158

n_neighbors = 10 ,准确率0.9473684210526315

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值