K均值算法实践:minist数据集应用分析

版权申诉
5星 · 超过95%的资源 2 下载量 156 浏览量 更新于2024-10-06 1 收藏 12.66MB RAR 举报
资源摘要信息: "本课程资源主要围绕K均值算法(K-means)以及使用minist数据集的实现和应用。K均值算法是一种非常流行的聚类分析方法,它通过对数据集中的样本进行迭代,将相似的数据点划分到同一个簇中,从而达到数据分组的目的。课程将介绍K均值算法的基本原理、算法步骤以及优缺点,并且通过minist数据集进行实例演练,帮助学习者更好地理解和掌握该算法的应用。minist数据集是一个常用的手写数字图像数据集,包含了大量的手写数字图片,被广泛应用于机器学习、模式识别等领域的研究和教学中。" ### K均值算法(K-means)知识点 #### 1. K均值算法简介 - **定义**: K均值是一种迭代算法,用来将具有相似特征的数据点分为K个簇。 - **作用**: 主要用于数据的分类或聚类,不依赖于预设的类别标签。 #### 2. 算法原理 - **初始化**: 随机选择K个数据点作为初始簇心。 - **分配**: 将每个数据点分配到最近的簇心,形成K个簇。 - **更新**: 对于每个簇,重新计算簇内所有点的均值,并将该均值设为新的簇心。 - **迭代**: 重复分配和更新步骤,直到簇心不再变化或达到预定的迭代次数。 #### 3. 算法步骤 - 选择K个初始质心。 - 对于每个数据点,根据距离最近的质心分配一个簇。 - 重新计算每个簇的质心。 - 重复以上两个步骤,直到质心不再变化或达到设定的停止条件。 #### 4. 算法优缺点 - **优点**: - 算法简单、易于实现。 - 收敛速度较快,适用于处理大数据集。 - **缺点**: - 需要预先指定簇的数量K,但实际中很难确定。 - 对初始质心选择敏感,可能导致结果不稳定。 - 对于非球形簇效果不佳,因为它假设簇为凸形。 #### 5. 应用场景 - 客户细分。 - 图像分割。 - 机器学习中的无监督学习。 - 数据压缩。 ### minist数据集知识点 #### 1. 数据集简介 - **起源**: 由美国国家标准与技术研究院(NIST)创建。 - **组成**: 包含了成千上万的手写数字图片,通常分为训练集和测试集。 #### 2. 数据集特性 - 每张图片的大小统一为28x28像素,为灰度图。 - 每个像素点的像素值范围是0-255,代表不同深浅的灰色。 - 数据集包含0-9共10个类别的手写数字。 #### 3. 数据集的使用 - **预处理**: 将图像数据转换为算法易于处理的格式。 - **特征提取**: 从原始图像中提取有用的信息,作为后续模型的输入。 - **模型训练**: 使用训练集来训练分类器或聚类器。 - **模型测试**: 使用测试集来评估模型的泛化能力。 #### 4. 数据集在教学中的应用 - **演示聚类算法**: 通过手写数字图像演示K均值聚类的效果。 - **机器学习算法的基准测试**: 作为机器学习算法性能比较的标准。 ### 实现K均值算法与minist数据集结合的步骤 #### 1. 数据准备 - 下载minist数据集。 - 对数据集进行预处理,包括归一化、调整数据格式等。 #### 2. K均值算法实现 - 编写K均值算法的代码,或者使用现有的库函数实现。 - 初始化K个簇心,可以随机选择或采用其他方法。 #### 3. 数据集聚类 - 将minist数据集输入到K均值算法中进行聚类。 - 分析聚类结果,调整K值以及算法参数以获得最佳效果。 #### 4. 结果评估与优化 - 使用合适的指标评估聚类效果,如轮廓系数、Davies-Bouldin指数等。 - 根据评估结果调整K均值算法的参数,优化聚类效果。 通过以上步骤,学习者可以初步实现K均值算法,并利用minist数据集进行实验,以便更深入地理解K均值聚类算法的工作原理和应用。

import numpy as np import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from scipy.spatial.distance import cdist import matplotlib.pyplot as plt from pandas import DataFrame from sklearn.decomposition import PCA plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 pd.set_option('display.max_rows', None)#显示全部行 pd.set_option('display.max_columns', None)#显示全部列 np.set_printoptions(threshold=np.inf) pd.set_option('display.max_columns', 9000) pd.set_option('display.width', 9000) pd.set_option('display.max_colwidth', 9000) df = pd.read_csv(r'附件1.csv',encoding='gbk') X = np.array(df.iloc[:, 1:]) X=X[0:,1:] k=93 kmeans_model = KMeans(n_clusters=k, random_state=123) fit_kmeans = kmeans_model.fit(X) # 模型训练 #查看聚类结果 kmeans_cc = kmeans_model.cluster_centers_ # 聚类中心 print('各类聚类中心为:\n', kmeans_cc) kmeans_labels = kmeans_model.labels_ # 样本的类别标签 print('各样本的类别标签为:\n', kmeans_labels) r1 = pd.Series(kmeans_model.labels_).value_counts() # 统计不同类别样本的数目 print('最终每个类别的数目为:\n', r1) # 输出聚类分群的结果 # cluster_center = pd.DataFrame(kmeans_model.cluster_centers_, # columns=[ str(x) for x in range(1,94)]) # 将聚类中心放在数据框中 # cluster_center.index = pd.DataFrame(kmeans_model.labels_). \ # drop_duplicates().iloc[:, 0] # 将样本类别作为数据框索引 # print(cluster_center)代码解释

2023-06-13 上传
2023-05-10 上传

import time import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import MiniBatchKMeans, KMeans from sklearn.metrics.pairwise import pairwise_distances_argmin from sklearn.datasets import make_blobs # Generate sample data np.random.seed(0) batch_size = 45 centers = [[1, 1], [-1, -1], [1, -1]] n_clusters = len(centers) X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7) # Compute clustering with Means k_means = KMeans(init='k-means++', n_clusters=3, n_init=10) t0 = time.time() k_means.fit(X) t_batch = time.time() - t0 # Compute clustering with MiniBatchKMeans mbk = MiniBatchKMeans(init='k-means++', n_clusters=3, batch_size=batch_size, n_init=10, max_no_improvement=10, verbose=0) t0 = time.time() mbk.fit(X) t_mini_batch = time.time() - t0 # Plot result fig = plt.figure(figsize=(8, 3)) fig.subplots_adjust(left=0.02, right=0.98, bottom=0.05, top=0.9) colors = ['#4EACC5', '#FF9C34', '#4E9A06'] # We want to have the same colors for the same cluster from the # MiniBatchKMeans and the KMeans algorithm. Let's pair the cluster centers per # closest one. k_means_cluster_centers = k_means.cluster_centers_ order = pairwise_distances_argmin(k_means.cluster_centers_, mbk.cluster_centers_) mbk_means_cluster_centers = mbk.cluster_centers_[order] k_means_labels = pairwise_distances_argmin(X, k_means_cluster_centers) mbk_means_labels = pairwise_distances_argmin(X, mbk_means_cluster_centers) # KMeans for k, col in zip(range(n_clusters), colors): my_members = k_means_labels == k cluster_center = k_means_cluster_centers[k] plt.plot(X[my_members, 0], X[my_members, 1], 'w', markerfacecolor=col, marker='.') plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6) plt.title('KMeans') plt.xticks(()) plt.yticks(()) plt.show() 这段代码每一句在干什么

2023-06-01 上传