根据提供的预处理过的MNIST手写体识别数据集及相关资料使用PCA进行降维保留85的能量应用层次聚类和K-Means方法进行聚类。用实验方法选取聚类方法中超参数并对聚类的效果进行评价。需要在实验报告中给出完整实现代码、运行结果、评价指标。所给数据为data_clustering_flamecsv、MNIST_traincsv和DS_Store部分数据如下所示:label pixel0 pixel1
本次实验需要用到的数据集包括:
- 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/fNks 著作权归作者所有。请勿转载和采集!