建筑兔零基础人工智能自学记录58|k-means的手写字体识别-5
·
补充概念:
局部最优是一个优化问题中的概念,在某个小范围内的最佳结果。
和全局最优相比,全局最优是整个问题中的最佳结果。
关键区别:范围大小不同。局部最优是 “小圈子里的第一”,全局最优是 “所有人中的第一”。
训练神经网络时,如果参数更新卡在局部最优,模型可能无法正确拟合数据。也就是站在全局来看局部最优的结果是错的。
本次我们来尝试k-means的手写字体识别~结果如下:

首先安装sklearn
pip install scikit-learn

然后运行代码:
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
digits=load_digits()
data=digits.data
label=digits.target
from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=10)
kmeans.fit(data)
kmeans.cluster_centers_.shape
for i in range(10):
plt.style.use({'figure.figsize':(15,15)})
column=4
plt.subplot(1,column,i%column+1)
plt.imshow(kmeans.cluster_centers_[i].reshape(8,8))
plt.xticks([])
plt.yticks([])
plt.axis('off')
if i%column==column-1:
plt.show()
代码解读:
from sklearn.datasets import load_digits
从 sklearn 库的 datasets 模块中导入 load_digits 函数。sklearn 是一个强大的机器学习库,load_digits 函数用于加载手写数字数据集。
digits = load_digits()
- 调用
load_digits函数,将手写数字数据集加载到变量digits中。
data = digits.data
label = digits.target
data变量存储了手写数字图像的像素值。label变量存储了每个图像对应的实际数字标签。
from sklearn.cluster import KMeans
- 从
sklearn库的cluster模块中导入KMeans类。
kmeans = KMeans(n_clusters=10)
- 指定聚类的数量为 10。
- 因为手写数字有 0 - 9 共 10 个不同的数字,所以将数据聚成 10 类。
kmeans.fit(data)
- 调用
kmeans对象的fit方法,输入手写数字图像的像素值data进行训练。K - means 算法会尝试将数据点划分到 10 个不同的聚类中。
kmeans.cluster_centers_.shape
- 存储每个聚类的中心点。每个中心点是一个长度为 64 的一维数组(因为每个手写数字图像是 8x8 像素,共 64 个像素)。
for i in range(10):
- 开始一个循环,循环 10 次,因为我们有 10 个聚类,要依次展示每个聚类的中心点。
plt.style.use({'figure.figsize':(15,15)})
- 设置绘图的风格,将图形的大小设置为 15x15 英寸。
column = 4
plt.subplot(1, column, i % column + 1)
- 设置每行显示的子图数量为 4。
plt.subplot(1, column, i % column + 1)用于创建一个子图,1表示行数,column表示列数,i % column + 1表示当前子图的位置。这样可以在一个图形中依次显示多个子图。
plt.imshow(kmeans.cluster_centers_[i].reshape(8, 8))
kmeans.cluster_centers_[i]取出第i个聚类的中心点,它是一个长度为 64 的一维数组。reshape(8, 8)将这个一维数组重新调整为 8x8 的二维数组,以便将其作为图像显示。plt.imshow函数用于显示图像。
plt.xticks([])
plt.yticks([])
plt.axis('off')
plt.xticks([])和plt.yticks([])用于去除图像的 x 轴和 y 轴的刻度。plt.axis('off')用于关闭图像的坐标轴,使图像显示更加简洁。
if i % column == column - 1:
plt.show()
- 当
i是column的倍数减 1 时,即每行的最后一个子图绘制完成后,调用plt.show()函数显示当前的图形。
整段代码解读如下:
import matplotlib.pyplot as plt
#导入load_digits手写数字数据集
from sklearn.datasets import load_digits
#将手写数字数据集加载到变量 digits 中
digits=load_digits()
#存储了手写数字图像的像素值
data=digits.data
#存储了每个图像对应的实际数字标签
label=digits.target
#导入 KMeans
from sklearn.cluster import KMeans
#指定聚类的数量为 10
kmeans=KMeans(n_clusters=10)
#调用fit 方法训练data
kmeans.fit(data)
#存储每个聚类的中心点
kmeans.cluster_centers_.shape
#循环 10 次,依次展示每个聚类的中心点
for i in range(10):
plt.style.use({'figure.figsize':(15,15)})
column=4
plt.subplot(1,column,i%column+1)
plt.imshow(kmeans.cluster_centers_[i].reshape(8,8))
plt.xticks([])
plt.yticks([])
plt.axis('off')
if i%column==column-1:
plt.show()
这就是最简单的k-means应用,一起试试吧~
更多推荐
所有评论(0)