MNIST 手写体识别数据集降维与聚类分析:PCA、层次聚类和 K-Means 方法
本次实验需要用到的数据集包括:
- 'MNIST_train.csv':手写体识别数据集,包含 60000 个 28x28 的灰度图像,每个图像有 784 个像素点。
- 'data_clustering_flame.csv':用于测试聚类算法的数据集。
- '.DS_Store':MacOS 系统下的一个隐藏文件,可以忽略。
首先读入 'MNIST_train.csv' 数据集,并进行 PCA 降维。
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
# 读入数据
data = pd.read_csv('MNIST_train.csv')
# 提取像素点信息
X = data.iloc[:, 1:].values
# PCA降维
pca = PCA(n_components=0.85) # 保留85%的能量
X_pca = pca.fit_transform(X)
print('降维后的数据维度:', X_pca.shape)
接下来,我们使用层次聚类方法对数据进行聚类。这里我们选择使用 scipy 库中的 hierarchy 模块。
from scipy.cluster import hierarchy
# 层次聚类
Z = hierarchy.linkage(X_pca, method='ward') # 使用 Ward 方法
labels = hierarchy.fcluster(Z, t=30, criterion='distance') # 距离阈值为 30
print('层次聚类后的簇数:', len(np.unique(labels)))
在层次聚类方法中,我们需要选择簇的数量或者设定距离阈值来停止聚类。这里我们选择设定距离阈值为 30,即距离小于 30 的样本会被分到同一个簇中。
接下来,我们使用 K-Means 方法对数据进行聚类。这里我们选择使用 sklearn 库中的 KMeans 模块。
from sklearn.cluster import KMeans
# K-Means聚类
kmeans = KMeans(n_clusters=10, random_state=0) # 设定簇的数量为 10
kmeans.fit(X_pca)
labels = kmeans.labels_
print('K-Means聚类后的簇数:', len(np.unique(labels)))
在 K-Means 方法中,我们需要选择簇的数量。这里我们选择设定簇的数量为 10。
接下来,我们需要对聚类结果进行评价。这里我们选择使用轮廓系数。
from sklearn.metrics import silhouette_score
# 评价聚类结果
score = silhouette_score(X_pca, labels)
print('轮廓系数:', score)
轮廓系数的取值范围为 [-1, 1],值越大表示聚类效果越好。
完整代码如下:
原文地址: https://www.cveoy.top/t/topic/oqaY 著作权归作者所有。请勿转载和采集!