补充概念:

局部最优是一个优化问题中的概念,在某个小范围内的最佳结果。

和全局最优相比,全局最优是整个问题中的最佳结果。

    关键区别:范围大小不同。局部最优是 “小圈子里的第一”,全局最优是 “所有人中的第一”。

    训练神经网络时,如果参数更新卡在局部最优,模型可能无法正确拟合数据。也就是站在全局来看局部最优的结果是错的。

本次我们来尝试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应用,一起试试吧~

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐