恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
K-means聚类算法原理与Python实现详解
首页
资讯中心
/
K-means聚类算法原理与Python实现详解
K-means聚类算法原理与Python实现详解
发布时间:2026/9/13 12:56:57
1. K-means算法核心原理剖析K-means作为最经典的聚类算法之一其核心思想可以用一个生活场景来理解假设你要把一堆杂乱的衣物按颜色分类但事先不知道有多少种主色调。你会先随机选定几个颜色中心点比如红、蓝、绿然后每件衣服都归到最近的中心点接着重新计算每个颜色组的平均色作为新中心不断重复直到中心点不再移动——这就是K-means的具象化体现。1.1 数学建模过程算法通过最小化平方误差函数实现聚类目标J ΣΣ ||x - μ_i||²其中x是样本点μ_i是第i个簇的中心。这个目标函数使得簇内距离最小化通过以下步骤迭代优化随机初始化K个质心cluster centroids计算每个样本到质心的欧氏距离将样本分配到最近的质心所属簇重新计算每个簇的质心均值点重复2-4步直到质心变化小于阈值或达到最大迭代次数关键点欧氏距离计算采用标准的L2范数公式这也是K-means对球形分布数据效果好的原因。1.2 算法特性与局限优势维度时间复杂度O(nkt)适合大规模数据n样本数k簇数t迭代次数实现简单且容易并行化对密集的球形簇结构效果显著典型局限需要预先指定K值可通过肘部法则确定对噪声和离群点敏感初始质心选择影响结果可通过k-means优化只能发现凸形簇对带状分布效果差2. 手撕K-means解题全流程2.1 经典例题演示给定数据集A(1,1), B(1,2), C(2,2), D(5,4), E(6,5), F(6,6), G(7,5)要求分为2类K2初始质心选A(1,1)和D(5,4)。第一轮迭代计算所有点到质心的距离到A的距离A(0), B(1), C(1.41), D(5), E(6.4), F(6.7), G(7.2)到D的距离A(5), B(4.24), C(3.6), D(0), E(1.41), F(2.23), G(2.23)分配结果簇1A,B,C簇2D,E,F,G更新质心新质心1( (112)/3, (122)/3 ) (1.33, 1.67)新质心2( (5667)/4, (4565)/4 ) (6, 5)第二轮迭代重新计算距离后簇分配不变算法收敛。最终聚类结果簇1A,B,C簇2D,E,F,G2.2 解题技巧备忘录距离矩阵法建议先构建距离矩阵避免重复计算质心更新验证每次更新后检查是否仍在样本空间内终止条件设定常用Δ质心位置1e-4或迭代次数100空簇处理当某簇无样本时可重新选择最远点作为新质心3. Python实现与工程实践3.1 原生代码实现import numpy as np def k_means(X, k, max_iters100): # 随机初始化质心 centroids X[np.random.choice(len(X), k, replaceFalse)] for _ in range(max_iters): # 分配样本到最近质心 distances np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis2)) labels np.argmin(distances, axis0) # 更新质心 new_centroids np.array([X[labelsi].mean(axis0) for i in range(k)]) # 收敛判断 if np.allclose(centroids, new_centroids): break centroids new_centroids return labels, centroids # 示例数据 data np.array([[1,1],[1,2],[2,2],[5,4],[6,5],[6,6],[7,5]]) labels, centers k_means(data, k2) print(Cluster labels:, labels) print(Final centers:, centers)3.2 工业级优化方案使用sklearn的MiniBatchKMeans处理大数据from sklearn.cluster import MiniBatchKMeans mbk MiniBatchKMeans(n_clusters2, batch_size100) mbk.fit(data)特征标准化最佳实践from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X)并行计算配置KMeans(n_clusters3, n_init10, n_jobs-1) # n_jobs-1使用所有CPU核心4. 实战避坑指南4.1 参数选择黄金法则K值确定方法对比方法实现方式适用场景肘部法则观察SSE下降拐点数据分布明显轮廓系数计算样本与其簇的相似度各类形状簇Gap Statistic比较实际数据与参考分布噪声较多数据初始质心优化# k-means初始化 from sklearn.cluster import KMeans kmeans KMeans(n_clusters3, initk-means)4.2 典型问题解决方案问题1聚类结果不稳定方案设置random_state参数固定随机种子代码KMeans(n_clusters3, random_state42)问题2存在离群点干扰方案1使用DBSCAN预处理去除噪声点方案2改用K-medoids算法基于中心点而非均值问题3高维数据效果差降维处理from sklearn.decomposition import PCA pca PCA(n_components0.95) # 保留95%方差 X_reduced pca.fit_transform(X)5. 进阶应用场景5.1 图像颜色量化from sklearn.utils import shuffle image plt.imread(flower.jpg) w, h, d image.shape image_array shuffle(image.reshape(w*h, d), n_samples1000) kmeans KMeans(n_clusters64).fit(image_array) new_colors kmeans.cluster_centers_[kmeans.predict(image.reshape(w*h, d))] plt.imshow(new_colors.reshape(w, h, d))5.2 用户分群实战电商用户RFM聚类特征工程R最近购买时间F购买频率M消费金额三维特征标准化寻找最佳K值from sklearn.metrics import silhouette_score scores [] for k in range(2,8): kmeans KMeans(n_clustersk).fit(rfm_data) scores.append(silhouette_score(rfm_data, kmeans.labels_)) optimal_k np.argmax(scores) 2 # 索引偏移补偿工程经验商业场景中常结合业务知识调整聚类结果比如将高价值用户单独细分。