1. 引言K-means 聚类是机器学习领域最经典、应用最广泛的无监督学习算法之一。它通过迭代计算将数据集划分为 K 个互斥的簇cluster使得同一簇内的数据点尽可能相似而不同簇间的数据点尽可能不同。由于其思想直观、实现简单、效率较高K-means 被广泛应用于客户分群、图像分割、文档归类、异常检测等诸多场景。本文将系统性地梳理 K-means 聚类的完整知识点涵盖其核心思想、数学原理、算法步骤、关键参数与优化、优缺点分析以及 Python 实战示例帮助你从零开始全面掌握这一重要算法。2. 核心思想与目标K-means 算法的核心思想可以概括为“物以类聚”。给定一个包含 N 个数据点的数据集和预设的簇数量 K算法的目标是将每个数据点分配到离其最近的“簇中心”centroid所代表的簇中。根据每个簇中所有数据点的位置重新计算该簇的簇中心通常取均值。不断迭代上述两个步骤直到簇中心的位置不再发生显著变化或达到最大迭代次数此时认为算法收敛。其优化的目标函数是最小化簇内平方和Within-Cluster Sum of Squares, WCSS也称为畸变DistortionJ∑i1K∑x∈Ci∣∣x−μi∣∣2 J \sum_{i1}^{K} \sum_{\mathbf{x} \in C_i} ||\mathbf{x} - \boldsymbol{\mu}_i||^2Ji1∑K​x∈Ci​∑​∣∣x−μi​∣∣2其中KKK是簇的个数。CiC_iCi​是第iii个簇。μi\boldsymbol{\mu}_iμi​是第iii个簇的质心均值向量。x\mathbf{x}x是簇CiC_iCi​中的一个数据点。∣∣x−μi∣∣2||\mathbf{x} - \boldsymbol{\mu}_i||^2∣∣x−μi​∣∣2是数据点到其所属簇质心的欧氏距离的平方。算法通过不断调整数据点的分配和簇中心的位置来最小化这个目标函数JJJ。3. 算法步骤详解标准的 K-means 算法遵循以下步骤步骤 1初始化随机从数据集中选择 K 个点作为初始簇中心质心。步骤 2分配阶段对于数据集中的每一个数据点计算其到 K 个簇中心的距离通常使用欧氏距离并将其分配给距离最近的簇中心所对应的簇。步骤 3更新阶段对于每一个簇重新计算其质心。新的质心是该簇所有数据点的均值向量。步骤 4迭代重复步骤 2分配和步骤 3更新直到满足停止条件。常见的停止条件有质心的位置变化小于某个阈值。目标函数JJJ的变化小于某个阈值。达到预设的最大迭代次数。下面的流程图清晰地展示了这一迭代过程否是开始输入数据集与K值随机初始化K个质心将每个数据点分配到最近的质心重新计算每个簇的质心取簇内点的均值质心是否变化显著或达到最大迭代次数输出最终的K个簇及质心4. 关键参数与优化4.1 如何选择 K 值K 是一个需要预先指定的超参数其选择至关重要。肘部法则Elbow Method绘制不同 K 值对应的 WCSS 曲线。WCSS 会随着 K 增大而减小当 K 增加到真实簇数时WCSS 的下降幅度会突然变缓曲线形似“肘部”该点对应的 K 值可作为参考。轮廓系数Silhouette Score结合了簇内的凝聚度和簇间的分离度。轮廓系数的取值范围为 [-1, 1]值越大表示聚类效果越好。可以计算不同 K 值下的平均轮廓系数选择使其最大化的 K。业务理解很多时候K 值由实际应用场景决定例如将客户分为高、中、低价值3类。4.2 初始化的改进K-means随机初始化可能导致算法收敛到局部最优解。K-means 是一种智能初始化方法随机选择第一个质心。对于每个数据点计算其与已选质心的最短距离D(x)D(x)D(x)。按照D(x)2D(x)^2D(x)2的概率分布随机选择下一个质心距离越远的点被选中的概率越大。重复步骤 2-3直到选出 K 个质心。这种方法能使初始质心彼此远离通常能获得更快、更好的收敛结果。sklearn中的KMeans默认使用initk-means。4.3 距离度量默认使用欧氏距离适用于连续数值型数据。对于其他类型的数据可以考虑曼哈顿距离、余弦相似度等但标准的 K-means 算法基于均值计算质心与欧氏距离最小化在数学上等价。5. 算法的优缺点5.1 优点原理简单易于理解和实现。对于大数据集计算效率相对较高时间复杂度约为O(N⋅K⋅I⋅d)O(N \cdot K \cdot I \cdot d)O(N⋅K⋅I⋅d)其中NNN为样本数III为迭代次数ddd为维度。当簇的形状为凸球形且大小相近时效果很好。5.2 缺点与局限性需要预先指定 K 值且 K 值选择不当会影响结果。对初始质心敏感可能收敛到局部最优使用 K-means 可缓解。对噪声和离群点敏感因为它们会显著影响均值的计算。不适合发现非凸形状的簇如环形、月牙形。对数据尺度敏感在应用前通常需要进行标准化如 Z-score 标准化。6. Python 实战示例下面我们使用scikit-learn和matplotlib库演示一个完整的 K-means 聚类流程。6.1 环境准备与数据生成importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_blobsfromsklearn.clusterimportKMeansfromsklearn.metricsimportsilhouette_scorefromsklearn.preprocessingimportStandardScaler# 生成模拟数据X,y_truemake_blobs(n_samples300,centers4,cluster_std0.60,random_state0)plt.scatter(X[:,0],X[:,1],s50)plt.title(原始数据)plt.show()6.2 使用肘部法则选择 K 值# 肘部法则wcss[]foriinrange(1,11):kmeansKMeans(n_clustersi,initk-means,max_iter300,n_init10,random_state0)kmeans.fit(X)wcss.append(kmeans.inertia_)# inertia_ 属性即 WCSSplt.plot(range(1,11),wcss)plt.title(肘部法则)plt.xlabel(簇的数量 (K))plt.ylabel(WCSS)plt.show()观察图形WCSS 下降的“肘部”通常出现在 K4 附近。6.3 训练 K-means 模型并可视化# 根据肘部法则选择 K4kmeansKMeans(n_clusters4,initk-means,max_iter300,n_init10,random_state0)y_kmeanskmeans.fit_predict(X)# 可视化聚类结果plt.scatter(X[y_kmeans0,0],X[y_kmeans0,1],s50,clightblue,label簇 1)plt.scatter(X[y_kmeans1,0],X[y_kmeans1,1],s50,corange,label簇 2)plt.scatter(X[y_kmeans2,0],X[y_kmeans2,1],s50,cgreen,label簇 3)plt.scatter(X[y_kmeans3,0],X[y_kmeans3,1],s50,cred,label簇 4)# 绘制质心plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s200,cblack,markerX,label质心)plt.title(K-means 聚类结果)plt.legend()plt.show()print(f簇中心坐标:\n{kmeans.cluster_centers_})print(f轮廓系数:{silhouette_score(X,y_kmeans):.4f})6.4 对非球形数据的局限性演示fromsklearn.datasetsimportmake_moons# 生成月牙形数据X_moons,_make_moons(n_samples200,noise0.05,random_state0)kmeans_moonsKMeans(n_clusters2,random_state0)y_moons_predkmeans_moons.fit_predict(X_moons)plt.scatter(X_moons[:,0],X_moons[:,1],cy_moons_pred,s50,cmapviridis)plt.scatter(kmeans_moons.cluster_centers_[:,0],kmeans_moons.cluster_centers_[:,1],s200,cred,markerX)plt.title(K-means 对非凸形状聚类效果不佳)plt.show()可以看到K-means 无法正确划分月牙形数据此时应考虑 DBSCAN 或谱聚类等算法。7. 总结与扩展K-means 是聚类分析的基石。掌握其原理、实现和局限性是学习更复杂聚类算法如 DBSCAN、层次聚类、高斯混合模型的良好起点。在实际应用中请注意数据预处理务必进行标准化/归一化。多次运行由于随机初始化可以多次运行算法n_init参数并选择最优结果。结合业务验证聚类结果最终需要结合业务知识进行解读和验证。探索变体如 K-medoids对离群点更鲁棒、Mini-Batch K-means适用于大数据集。希望这篇完整的知识点梳理能帮助你深入理解并有效应用 K-means 聚类算法。