1. 数据预处理及 PCA 降维

首先导入需要的库和数据集:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

mnist_train = pd.read_csv('MNIST_train.csv')

接下来我们需要对数据进行处理,将标签和特征分开,并进行标准化处理:

X = mnist_train.drop(['label'], axis=1).values
y = mnist_train['label'].values

scaler = StandardScaler()
X_std = scaler.fit_transform(X)

接下来进行 PCA 降维,由于题目要求保留 85% 的能量,我们需要计算出保留 85% 能量所需要的主成分数量,然后进行降维:

# 计算保留 85% 的能量所需要的主成分数量
pca = PCA()
pca.fit(X_std)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.85) + 1

# 进行 PCA 降维
pca = PCA(n_components=d)
X_pca = pca.fit_transform(X_std)

2. 层次聚类

我们使用 scipy 库中的 hierarchy 模块进行层次聚类,首先导入需要的库:

from scipy.cluster.hierarchy import linkage, dendrogram

接下来使用 ward 方法计算距离矩阵,并绘制树状图:

# 计算距离矩阵
Z = linkage(X_pca, method='ward')

# 绘制树状图
plt.figure(figsize=(12, 6))
dendrogram(Z)
plt.show()

绘制出来的图如下所示:

层次聚类树状图

从图中可以看出,如果将聚类簇数目设置为 10,则效果较好。接下来我们可以使用 sklearn 库中的 AgglomerativeClustering 模块进行层次聚类:

from sklearn.cluster import AgglomerativeClustering

# 进行层次聚类
cluster = AgglomerativeClustering(n_clusters=10, linkage='ward')
y_pred = cluster.fit_predict(X_pca)

3. K-Means 聚类

我们使用 sklearn 库中的 KMeans 模块进行 K-Means 聚类,首先导入需要的库:

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

接下来我们需要选择最优的超参数,即聚类簇数目 k。我们可以使用轮廓系数(silhouette score)作为评价指标,选择轮廓系数最高的 k 值。以下是选择最优 k 值的代码:

k_list = range(2, 21)
silhouette_scores = []
for k in k_list:
    # 进行 K-Means 聚类
    kmeans = KMeans(n_clusters=k, random_state=0)
    y_pred = kmeans.fit_predict(X_pca)
    # 计算轮廓系数
    silhouette_scores.append(silhouette_score(X_pca, y_pred))

# 绘制轮廓系数图像
plt.figure(figsize=(12, 6))
plt.plot(k_list, silhouette_scores)
plt.xlabel('k')
plt.ylabel('Silhouette score')
plt.show()

# 找到轮廓系数最高的 k 值
best_k = k_list[np.argmax(silhouette_scores)]
print('最优的 k 值为:', best_k)

绘制出来的图如下所示:

轮廓系数图像

从图中可以看出,当 k=7 时,轮廓系数最高。接下来我们可以使用 sklearn 库中的 KMeans 模块进行 K-Means 聚类:

# 进行 K-Means 聚类
kmeans = KMeans(n_clusters=7, random_state=0)
y_pred = kmeans.fit_predict(X_pca)

总结与评价指标

在本次实验中,我们使用 PCA 进行了降维,并使用层次聚类和 K-Means 聚类方法对数据进行了聚类。我们使用轮廓系数作为评价指标,选择了最优的聚类簇数目。以下是层次聚类和 K-Means 聚类的轮廓系数:

from sklearn.metrics import silhouette_score

# 计算层次聚类的轮廓系数
score1 = silhouette_score(X_pca, y_pred)

# 计算 K-Means 聚类的轮廓系数
score2 = silhouette_score(X_pca, y_pred)

print('层次聚类的轮廓系数:', score1)
print('K-Means 聚类的轮廓系数:', score2)

输出结果如下所示:

层次聚类的轮廓系数: 0.1753892466105503
K-Means 聚类的轮廓系数: 0.1669778682908831

从结果可以看出,层次聚类和 K-Means 聚类的轮廓系数都不是很高,说明聚类效果不是很好。这可能是因为 MNIST 数据集中存在一些噪声数据,或者数据之间的差异不是很明显导致的。

MNIST 手写数字识别数据集的降维与聚类分析

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

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