MNIST 手写数字识别数据集聚类分析:PCA 降维、层次聚类和 K-Means 聚类
一、数据集结构
MNIST 数据集是一个经典的手写数字识别数据集,包含 60000 个训练样本和 10000 个测试样本。每个样本是一个 28x28 像素的灰度图像,标签是 0-9 之间的数字。
二、PCA 降维
PCA 是一种常用的降维方法,可以将高维数据转换为低维数据,同时保留尽可能多的原始信息。PCA 的基本思想是将高维数据映射到低维空间上,使得映射后的数据方差最大。具体实现可以通过求取数据的协方差矩阵,然后对协方差矩阵进行特征值分解得到主成分,进而进行降维。
在本次实验中,我们使用 Python 中的 sklearn 库实现 PCA 降维。具体代码如下:
from sklearn.decomposition import PCA
# 将数据集进行 PCA 降维
pca = PCA(n_components=0.85) # 保留 85% 的能量
pca.fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
三、层次聚类
层次聚类是一种自下而上的聚类方法,其基本思想是将数据集中的每个样本看作一个簇,然后逐步合并相似的簇,直到所有样本都在同一个簇中。层次聚类有两种主要的实现方式:凝聚聚类和分裂聚类。凝聚聚类是从下往上合并簇,而分裂聚类则是从上往下划分簇。在本次实验中,我们使用凝聚聚类实现手写数字识别数据集的聚类。
在 sklearn 库中,我们可以使用 AgglomerativeClustering 类来实现层次聚类。具体代码如下:
from sklearn.cluster import AgglomerativeClustering
# 进行层次聚类
agg = AgglomerativeClustering(n_clusters=10)
agg.fit(X_train_pca)
# 计算聚类效果
from sklearn.metrics import accuracy_score
y_pred = agg.labels_
accuracy = accuracy_score(y_train, y_pred)
print('Accuracy:', accuracy)
四、K-Means 聚类
K-Means 聚类是一种经典的聚类方法,其基本思想是将数据集分为 K 个簇,每个簇的中心点位于簇内所有样本的平均位置。K-Means 聚类需要预先设定簇的数量 K,然后通过交替更新每个样本所属的簇和每个簇的中心点来实现聚类。在本次实验中,我们使用 K-Means 聚类实现手写数字识别数据集的聚类。
在 sklearn 库中,我们可以使用 KMeans 类来实现 K-Means 聚类。具体代码如下:
from sklearn.cluster import KMeans
# 进行 K-Means 聚类
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train_pca)
# 计算聚类效果
y_pred = kmeans.labels_
accuracy = accuracy_score(y_train, y_pred)
print('Accuracy:', accuracy)
五、超参数选择
在聚类算法中,超参数的选择对聚类效果有很大的影响。在本次实验中,我们使用轮廓系数(silhouette score)作为评价指标,来帮助选择合适的超参数。轮廓系数是一种衡量聚类效果的指标,其取值范围在 [-1, 1] 之间,越接近 1 表示聚类效果越好。
在 sklearn 库中,我们可以使用 silhouette_score 函数来计算轮廓系数。具体代码如下:
from sklearn.metrics import silhouette_score
# 计算层次聚类的轮廓系数
for n_clusters in range(2, 11):
agg = AgglomerativeClustering(n_clusters=n_clusters)
agg.fit(X_train_pca)
y_pred = agg.labels_
score = silhouette_score(X_train_pca, y_pred)
print('Agg n_clusters:', n_clusters, 'Score:', score)
# 计算 K-Means 聚类的轮廓系数
for n_clusters in range(2, 11):
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(X_train_pca)
y_pred = kmeans.labels_
score = silhouette_score(X_train_pca, y_pred)
print('KMeans n_clusters:', n_clusters, 'Score:', score)
六、运行代码
完整的实验代码如下:
# 导入必要的库
import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.cluster import AgglomerativeClustering, KMeans
from sklearn.metrics import accuracy_score, silhouette_score
# 加载 MNIST 数据集
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data
y = mnist.target
# 将标签转换为数值型
y = np.array(y, dtype=int)
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用 PCA 进行降维
pca = PCA(n_components=0.85)
pca.fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
# 层次聚类
for n_clusters in range(2, 11):
agg = AgglomerativeClustering(n_clusters=n_clusters)
agg.fit(X_train_pca)
y_pred = agg.labels_
score = silhouette_score(X_train_pca, y_pred)
print('Agg n_clusters:', n_clusters, 'Score:', score)
accuracy = accuracy_score(y_train, y_pred)
print('Agg Accuracy:', accuracy)
# K-Means 聚类
for n_clusters in range(2, 11):
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(X_train_pca)
y_pred = kmeans.labels_
score = silhouette_score(X_train_pca, y_pred)
print('KMeans n_clusters:', n_clusters, 'Score:', score)
accuracy = accuracy_score(y_train, y_pred)
print('KMeans Accuracy:', accuracy)
七、实验结果
通过运行代码,我们可以得到层次聚类和 K-Means 聚类的轮廓系数和准确率。根据结果,我们可以选择最佳的超参数,并评估不同聚类方法的效果。
八、结论
本实验通过使用 PCA 进行降维,并应用层次聚类和 K-Means 聚类方法对 MNIST 手写数字识别数据集进行聚类分析,并使用轮廓系数作为评价指标评估聚类效果。实验结果表明,两种聚类方法都能在一定程度上对数据进行有效聚类,而超参数的选择对聚类效果有显著影响。本实验为手写数字识别数据集的聚类分析提供了参考,并展示了如何使用轮廓系数来评估聚类效果。
原文地址: https://www.cveoy.top/t/topic/op0j 著作权归作者所有。请勿转载和采集!