本次实验需要用到的数据集包括:

  • '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],值越大表示聚类效果越好。

完整代码如下:

MNIST 手写体识别数据集降维与聚类分析:PCA、层次聚类和 K-Means 方法

原文地址: https://www.cveoy.top/t/topic/oqaY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录