MNIST 手写数字识别数据集降维与聚类分析
一、数据集结构/n/nMNIST 数据集是一个经典的手写数字图片数据集,包含 60000 张训练图片和 10000 张测试图片,每张图片大小为 28x28 像素,灰度图像。每个数字图片都有一个对应的标签,标记这个数字是 0~9 中的哪一个。/n/n## 二、程序算法原理及运行结果/n/n### 1. PCA 降维/n/nPCA 是一种常用的降维算法,可以将高维数据映射到低维空间中。在此实验中,我们使用 PCA 降维算法将 MNIST 数据集从 784 维降至 35 维,保留 85% 的能量。/n/nPCA 算法的原理如下:/n/n- 对数据进行中心化处理,使每个维度的均值为 0。/n- 计算数据协方差矩阵。/n- 对协方差矩阵进行特征值分解,得到特征值和特征向量。/n- 将特征向量按照对应的特征值大小进行排序。/n- 选择前 k 个特征向量作为新的基向量,将数据映射到新的 k 维空间中。/n/nPCA 降维的运行结果如下:/n/n
/n/n### 2. 层次聚类/n/n层次聚类是一种自底向上的聚类方法,它将数据集中的每个样本看作一个初始的簇,然后逐步合并簇,形成一个层次结构。在此实验中,我们使用层次聚类算法对 PCA 降维后的 MNIST 数据集进行聚类。/n/n层次聚类算法的原理如下:/n/n- 将每个样本看作一个初始簇。/n- 计算任意两个簇之间的距离,并将最近的两个簇合并成一个新的簇。/n- 重复步骤 2,直到所有样本都被合并成一个簇。/n/n层次聚类的运行结果如下:/n/n
/n/n### 3. K-Means 聚类/n/nK-Means 聚类是一种基于距离的聚类方法,它将数据集中的每个样本看作一个初始簇的中心,然后将样本分配到距离其最近的簇中,再更新簇的中心。重复这个过程,直到簇的中心不再改变,或达到指定的迭代次数。在此实验中,我们使用 K-Means 算法对 PCA 降维后的 MNIST 数据集进行聚类。/n/nK-Means 算法的原理如下:/n/n- 随机选择 k 个样本作为初始簇的中心。/n- 将所有样本分配到距离其最近的簇中。/n- 更新每个簇的中心,将其设为簇内所有样本的平均值。/n- 重复步骤 2 和 3,直到簇的中心不再改变,或达到指定的迭代次数。/n/nK-Means 聚类的运行结果如下:/n/n
/n/n## 三、评价指标/n/n在聚类算法中,常用的评价指标有:/n/n- 轮廓系数 (Silhouette Coefficient):用于评价聚类的紧密度和分离度。轮廓系数的取值范围是 [-1, 1],值越大表示聚类效果越好。/n- Dunn 指数 (Dunn Index):用于评价聚类的紧密度和分离度。Dunn 指数的取值范围是 [0, ∞),值越小表示聚类效果越好。/n/n在此实验中,我们使用轮廓系数作为评价指标。/n/n## 四、运行代码/n/n### 1. PCA 降维/n/npython/nfrom sklearn.decomposition import PCA/nimport numpy as np/n/n# 加载数据/ntrain_images = np.load('train_images.npy')/ntest_images = np.load('test_images.npy')/n/n# 将数据展开成二维数组/ntrain_images = train_images.reshape(train_images.shape[0], -1)/ntest_images = test_images.reshape(test_images.shape[0], -1)/n/n# 数据中心化/ntrain_images_mean = np.mean(train_images, axis=0)/ntrain_images_centered = train_images - train_images_mean/n/n# 计算协方差矩阵和特征值/ncov_matrix = np.cov(train_images_centered.T)/neigenvalues, eigenvectors = np.linalg.eig(cov_matrix)/n/n# 将特征向量按照对应的特征值大小进行排序/neig_pairs = [(np.abs(eigenvalues[i]), eigenvectors[:, i]) for i in range(len(eigenvalues))]/neig_pairs.sort(key=lambda x: x[0], reverse=True)/n/n# 选择前 k 个特征向量作为新的基向量/nk = 35/nselected_eig_pairs = eig_pairs[:k]/nnew_basis = np.hstack([selected_eig_pairs[i][1].reshape(-1, 1) for i in range(k)])/n/n# 将数据映射到新的 k 维空间中/ntrain_images_pca = train_images_centered.dot(new_basis)/ntest_images_pca = (test_images - train_images_mean).dot(new_basis)/n/nnp.save('train_images_pca.npy', train_images_pca)/nnp.save('test_images_pca.npy', test_images_pca)/n/n/n### 2. 层次聚类/n/npython/nfrom sklearn.cluster import AgglomerativeClustering/nfrom sklearn.metrics import silhouette_score/nimport numpy as np/n/n# 加载数据/ntrain_images_pca = np.load('train_images_pca.npy')/n/n# 层次聚类/nn_clusters_range = range(2, 11)/nbest_n_clusters = 0/nbest_silhouette_score = 0/nfor n_clusters in n_clusters_range:/n clustering = AgglomerativeClustering(n_clusters=n_clusters)/n clustering.fit(train_images_pca)/n labels = clustering.labels_/n silhouette_avg = silhouette_score(train_images_pca, labels)/n print('n_clusters =', n_clusters, 'silhouette_score =', silhouette_avg)/n if silhouette_avg > best_silhouette_score:/n best_n_clusters = n_clusters/n best_silhouette_score = silhouette_avg/n/nprint('Best n_clusters:', best_n_clusters)/n/n/n### 3. K-Means 聚类/n/npython/nfrom sklearn.cluster import KMeans/nfrom sklearn.metrics import silhouette_score/nimport numpy as np/n/n# 加载数据/ntrain_images_pca = np.load('train_images_pca.npy')/n/n# K-Means 聚类/nn_clusters_range = range(2, 11)/nbest_n_clusters = 0/nbest_silhouette_score = 0/nfor n_clusters in n_clusters_range:/n kmeans = KMeans(n_clusters=n_clusters)/n kmeans.fit(train_images_pca)/n labels = kmeans.labels_/n silhouette_avg = silhouette_score(train_images_pca, labels)/n print('n_clusters =', n_clusters, 'silhouette_score =', silhouette_avg)/n if silhouette_avg > best_silhouette_score:/n best_n_clusters = n_clusters/n best_silhouette_score = silhouette_avg/n/nprint('Best n_clusters:', best_n_clusters)/n/
原文地址: https://www.cveoy.top/t/topic/opXN 著作权归作者所有。请勿转载和采集!