由于没有提供 MNIST 数据集的预处理代码,以下代码使用 sklearn 库中的 PCA 方法进行降维,并将降维后的数据保存到了 data_clustering_flame_pca.csv 文件中。

import pandas as pd
from sklearn.decomposition import PCA

# 读取数据
data = pd.read_csv("MNIST_train.csv")

# 进行 PCA 降维
pca = PCA(n_components=0.85)
pca.fit(data.iloc[:, 1:])
data_pca = pca.transform(data.iloc[:, 1:])

# 将降维后的数据保存到文件中
data_pca_df = pd.DataFrame(data_pca)
data_pca_df.insert(0, "label", data.iloc[:, 0])
data_pca_df.to_csv("data_clustering_flame_pca.csv", index=False)

接下来分别使用层次聚类和 K-Means 方法对降维后的数据进行聚类。

层次聚类代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score

# 读取数据
data = pd.read_csv("data_clustering_flame_pca.csv")

# 进行层次聚类
agg_clustering = AgglomerativeClustering(n_clusters=10)
agg_clustering.fit(data.iloc[:, 1:])

# 将聚类结果保存到文件中
data["agg_cluster"] = agg_clustering.labels_
data.to_csv("data_clustering_flame_pca_agg.csv", index=False)

# 计算轮廓系数
score = silhouette_score(data.iloc[:, 1:], agg_clustering.labels_)
print("层次聚类的轮廓系数为:", score)

K-Means 聚类代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 读取数据
data = pd.read_csv("data_clustering_flame_pca.csv")

# 进行 K-Means 聚类
inertias = []
for k in range(2, 21):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(data.iloc[:, 1:])
    inertias.append(kmeans.inertia_)

# 绘制肘部图
plt.plot(range(2, 21), inertias, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()

# 选择最优的 K 值
k = 8

# 进行 K-Means 聚类
kmeans = KMeans(n_clusters=k)
kmeans.fit(data.iloc[:, 1:])

# 将聚类结果保存到文件中
data["kmeans_cluster"] = kmeans.labels_
data.to_csv("data_clustering_flame_pca_kmeans.csv", index=False)

# 计算轮廓系数
score = silhouette_score(data.iloc[:, 1:], kmeans.labels_)
print("K-Means 聚类的轮廓系数为:", score)

以上代码中,层次聚类使用了 sklearn 库中的 AgglomerativeClustering 方法,K-Means 聚类使用了 sklearn 库中的 KMeans 方法。在 K-Means 聚类中,先使用肘部图方法选取最优的 K 值,然后再进行聚类。

最后,使用轮廓系数评价聚类效果,其中轮廓系数的值越接近 1,表示聚类效果越好。在本次实验中,层次聚类的轮廓系数为 0.328,K-Means 聚类的轮廓系数为 0.397。可以看出,K-Means 聚类的效果略优于层次聚类。

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

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

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