站长统计app下载免费,网站建设哪家比较好,网站视频如何下载,网站上的验证码怎么做大家好#xff01;#xff01;欢迎再次来到我的技术分享博客~ #x1f44b;在前期文章中#xff0c;我们系统剖析了K-means的随机初始化缺陷、CanopyK-means的粗粒度预处理以及K-means的概率化质心选择。今天#xff0c;我们解锁另一种高效优化方…大家好欢迎再次来到我的技术分享博客~ 在前期文章中我们系统剖析了K-means的随机初始化缺陷、CanopyK-means的粗粒度预处理以及K-means的概率化质心选择。今天我们解锁另一种高效优化方案——二分K-meansBisecting K-Means它用层次分裂策略彻底规避初始点敏感性问题并与前三篇内容形成完美闭环 K-means算法详解 Canopy K-means优化方案 K-means优化算法
今天我们将一起学习 二分K-means看看它是如何通过一种递归二分的方法来优化K-means算法的聚类效果和效率的 什么是二分K-means
二分K-means 是对传统K-means算法的改进它通过递归地将数据集一分为二逐步增加聚类数量直到达到指定的K值。这种方法可以避免传统K-means在初始化中心点时可能带来的问题同时提高聚类的准确性和效率。 二分K-means算法原理
二分K-means的核心思想是通过递归二分的方式逐步优化聚类结果。每次迭代中算法会选择当前聚类中SSE误差平方和最大的那个聚类进行二分直到聚类数量达到K。 二分K-means算法步骤 初始化将所有数据点视为一个聚类。 计算SSE计算当前所有聚类的SSE误差平方和。SSE越小说明聚类效果越好。 选择二分聚类选择SSE最大的那个聚类进行二分。 执行K-means对选定的聚类使用K-means算法进行二分即分为两个聚类。 重复步骤2-4直到聚类数量达到指定的K值。 输出结果得到最终的K个聚类。 二分K-means的优缺点
优点
提高聚类准确性通过递归二分的方式逐步优化聚类结果更有可能找到全局最优解。避免初始中心点问题使用K-means进行二分避免了传统K-means在初始化中心点时可能带来的问题。️高效性相比传统K-means二分K-means在达到相同聚类效果时通常需要更少的迭代次数。⏳
缺点
K值需要预先指定和传统K-means一样二分K-means也需要预先指定K值而K值的选择对聚类结果有很大影响。可能陷入局部最优虽然相比传统K-means有所改进但二分K-means仍然可能陷入局部最优解特别是在数据分布复杂的情况下。 适用场景
二分K-means适用于大多数需要聚类的场景特别是当数据集较大、维度较高且对聚类准确性有较高要求时。例如
图像分割将图像中的像素点聚类成不同的区域提高分割的准确性。️客户细分根据客户的购买行为将客户聚类成不同的群体以便进行更精准的营销。️异常检测通过聚类识别出数据中的异常点或离群点。 场景示例代码
下面是一个使用Python和自定义函数实现二分K-means的简单示例由于scikit-learn没有直接提供二分K-means的实现我们通过自定义函数来模拟
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobsdef binary_kmeans(X, K):# 初始化聚类中心列表和聚类标签列表centers [np.mean(X, axis0)]labels np.zeros(len(X), dtypeint)# 递归二分直到聚类数量达到Kwhile len(centers) K:# 计算每个聚类的SSEsse []for i, center in enumerate(centers):cluster_points X[labels i]distances np.linalg.norm(cluster_points - center, axis1)sse.append(np.sum(distances ** 2))# 选择SSE最大的聚类进行二分max_sse_idx np.argmax(sse)cluster_points X[labels max_sse_idx]# 使用K-means进行二分kmeans KMeans(initk-means, n_clusters2, random_state0)kmeans.fit(cluster_points)new_labels kmeans.labels_# 更新聚类中心和聚类标签centers[max_sse_idx] kmeans.cluster_centers_[0]centers.append(kmeans.cluster_centers_[1])# 更新所有点的聚类标签new_labels new_labels max_sse_idx * np.ones_like(new_labels) # 调整标签以避免冲突for i, label in enumerate(labels):if label max_sse_idx:labels[i] new_labels[np.where((cluster_points X[i]).all(axis1))[0][0]]# 对于新加入的点即二分后的第二个聚类中的点需要重新分配标签这里简化处理实际可能需要更复杂的逻辑# 由于上述简化处理可能不完美以下是一个更完整的标签更新方式但可能不是最高效的# 更完整的标签更新重新计算所有点的标签all_centers np.array(centers)distances np.linalg.norm(X[:, np.newaxis] - all_centers, axis2)labels np.argmin(distances, axis1)return labels, centers# 生成模拟数据
X, y make_blobs(n_samples300, centers4, cluster_std0.60, random_state0)# 使用二分K-means进行聚类
labels, centers binary_kmeans(X, 4)# 可视化结果
plt.scatter(X[:, 0], X[:, 1], clabels, s50, cmapviridis)
plt.scatter(np.array(centers)[:, 0], np.array(centers)[:, 1], cred, s200, alpha0.75)
plt.title(Binary K-means Clustering)
plt.show()
注意上面的代码是一个简化版的二分K-means实现用于演示算法原理。在实际应用中可能需要更复杂的逻辑来处理标签更新和聚类中心的存储。为了更高效和准确的实现可以考虑使用其他优化方法或库。
运行这段代码你将看到一幅聚类结果图其中不同颜色的点代表不同的聚类红色的点代表聚类中心。️ 总结
二分K-means以层次分裂策略重塑K-means流程是处理大规模稳定聚类的利器。其核心价值在于
绝对稳定的输出消除随机初始化影响高效的树形分裂K-1次迭代完成聚类天然并行化满二叉树结构适配分布式计算 横向对比
方法初始点敏感性速度簇均衡性适用场景K-means随机极高慢中小型均匀数据集K-means低中高中小型数据CanopyK-means中低中慢中大样本高维数据二分K-means极低快低大规模稳定聚类 预告下一篇笔记介绍ISODATA优化算法
在下一篇博客中我们将继续探索K-means的优化方案介绍ISODATA算法。ISODATA通过动态调整聚类数量和合并/分裂聚类来应对数据分布复杂的情况。敬请期待哦
感谢大家的阅读如果你对二分K-means或任何其他技术话题有疑问或建议欢迎在评论区留言 希望这篇博客能帮助你更好地理解二分K-means算法如果你觉得有用别忘了点赞、分享和关注哦
拓展阅读
1、一文搞懂K-means聚类原理、选K技巧、实战代码全解析
2、Canopy K-means聚类算法的“黄金搭档”优化方案附代码
3、K-means让K-means“聪明”地选择初始中心点