超通俗讲透 K-Means 聚类算法
超通俗讲透 K-Means 聚类算法原理公式代码案例全解K-Means 是机器学习里最简单、最常用、速度最快的无监督聚类算法不管是本科实验、研究生论文、工业项目都高频使用。我用最白话、最详细、最容易懂的方式把原理、数学、代码、优缺点一次性讲全。一、K-Means 到底是什么一句话K-Means 把一堆数据分成 K 组让每组内部尽量像组之间尽量不像。它做的事不需要标签无监督你告诉它分几类K它自动找中心点自动分组速度极快百万数据也能跑二、最通俗的例子给学生分组假设你要按身高、体重给学生分 3 组随便选 3 个人当“临时组长”初始质心每个学生看自己离哪个组长最近就归到那一组每组算新组长组里所有人身高体重的平均值重复步骤 2、3直到分组不再变这就是 K-Means。三、算法步骤最清晰版步骤 1选 K 个初始中心随机选 K 个点当“质心”centroid。步骤 2分配点到最近的质心每个点算到每个质心的距离归到最近的那一类。步骤 3更新质心每一类的新质心 这一类所有点的平均值。步骤 4重复直到收敛质心几乎不动了就停止。四、数学原理看得懂的公式1. 目标函数要最小化让每一类内部点到中心的距离总和越小越好J∑i1K∑x∈Ci∥x−μi∥2 J \sum_{i1}^K \sum_{x \in C_i} \| x - \mu_i \|^2Ji1∑Kx∈Ci∑∥x−μi∥2CiC_iCi第 i 个簇μi\mu_iμi第 i 个簇的中心2. 质心计算公式μi1∣Ci∣∑x∈Cix \mu_i \frac{1}{|C_i|} \sum_{x \in C_i} xμi∣Ci∣1x∈Ci∑x就是簇内所有点的平均值。五、K-Means 优点与缺点面试必背优点速度极快适合大数据原理简单容易实现球状数据效果极好可解释性强缺点必须手动指定 K对初始中心点敏感对异常点噪声非常敏感只能分球状簇复杂形状不行六、完整实战代码鸢尾花数据集importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.clusterimportKMeansfromsklearn.datasetsimportload_irisfromsklearn.decompositionimportPCAfromsklearn.metricsimportsilhouette_score# 加载数据irisload_iris()Xiris.data# 1. 肘部法找最佳 Kinertia[]K_rangerange(2,11)forkinK_range:modelKMeans(n_clustersk,random_state42)model.fit(X)inertia.append(model.inertia_)plt.plot(K_range,inertia,o-)plt.xlabel(K)plt.ylabel(惯性距离总和)plt.title(肘部法找最佳K)plt.show()# 2. 训练 K-Meansk3modelKMeans(n_clustersk,initk-means,random_state42)labelsmodel.fit_predict(X)# 3. PCA 降维画图X_pcaPCA(2).fit_transform(X)plt.scatter(X_pca[:,0],X_pca[:,1],clabels,cmapviridis)plt.title(K-Means 聚类结果)plt.show()# 4. 输出评分scoresilhouette_score(X,labels)print(f轮廓系数 {score:.3f})七、怎么选最好的 K两种方法1. 肘部法Elbow Method看折线图的“拐弯点”。2. 轮廓系数Silhouette Score越接近 1 越好。八、怎么优化 K-Means必看1. 使用 k-means 选初始中心KMeans(initk-means)2. 数据标准化非常重要fromsklearn.preprocessingimportStandardScaler XStandardScaler().fit_transform(X)3. 多跑几次取最优KMeans(n_init10)九、K-Means 适合什么时候用✅ 数据量大✅ 簇形状接近球形✅ 已知要分几类✅ 追求速度与简单❌ 不适合形状奇怪的簇噪声很多不知道 K 是几十、总结最精炼K-Means 是最简单、最高速、最经典的聚类算法。核心就是三句话选中心 → 分组 → 更新中心 → 重复。只要你会用肘部法选 K、会标准化、会用 k-means基本 90% 的场景都能搞定。