Bisecting k-means 聚类算法解释

Posted

技术标签:

【中文标题】Bisecting k-means 聚类算法解释【英文标题】:Bisecting k-means clustering algorithm explanation 【发布时间】:2011-10-15 20:03:22 【问题描述】:

我被要求编写一个二等分 k-means 算法,但我不明白该算法。 我知道 k-means 算法。

你能解释一下算法,但不是academic language

谢谢。

【问题讨论】:

【参考方案1】:

这个想法是迭代地将您的点云分成两部分。换句话说,您构建一棵随机二叉树,其中每个分裂(一个具有两个子节点的节点)对应于将云的点分裂为 2。

你从一团点开始。

计算其质心(重心)w

在云的点中随机选择一个点cL

构造点cR作为cL与w比较的对称点(段cL->w与w->cR相同)

把你的云点一分为二,离cR最近的点属于子云R,离cL最近的点属于子云L

重申子云 R 和 L

注意事项:

您可以在使用后丢弃随机点。但是,请保留所有子库的质心。

当您的子云正好包含一个点时停止。

如果你想要 k 个簇,只需取 k 个质心,使它们包含初始云的所有点。如果你愿意,你可以做更复杂的事情(最小化云的方差等......)假设你想要 4 个集群(为方便起见,是 2 的幂)然后你只需要将你的云分成两部分,然后每一个亚云一分为二。如果您想要 8 个集群,则将这些子云一分为二再次切割。又是 16 个集群。

如果您想要 K 簇的 K 不是 2 的幂(比如说 24),那么请查看最接近的 2 的次幂。现在是 16。您仍然缺少 8 个集群。每个“16 级集群”是“16 级子云”的质心。你要做的是取 8 个“level-16-clusters”(例如随机)并将它们分别替换为两个“child”“level-32-clusters”。 (这两个子“level-32-clusters”对应两个“level-32-subcloud”,它们加起来就是父级“level-16-subcloud”)

【讨论】:

感谢您的回答,现在清楚多了。但是我有两件事我不明白 - “在云的点中随机选择一个点 cL” - 意味着我需要选择一个随机向量?第二件事 - 我不明白我需要为 K 个集群做什么? 嗯,你有一堆想要聚类的点,对吧?在云中选择一个点意味着......在云中选择一个点=)我不完全明白你所说的随机向量的意思......在云的点中选择,而不是在整个空间中随机选择。我已经更新了关于 K 个集群的帖子 我猜是向量平均点 =] 但是如果我的随机选择不好并导致不均匀的分裂簇怎么办?我虽然在做:每件事我都会选择 SSE 最大的集群——你怎么看? 我认为该算法看起来很……糟糕。但事实上,并非如此!我认为有一百万种方法可以改进它,是的,即使我不知道什么是 SSE(顺便说一句,SSE 是什么?),你的想法肯定是好的。但我认为这个想法是快速的,并且您可以构建许多二等分 k-means,就像制作随机森林一样 (en.wikipedia.org/wiki/Random_forest)(如果您阅读链接,您应该知道二等分 k-means真的真的很像决策树) 是的,它的误差平方和,谢谢。我想我会问教授他是否只是想分裂 - 就像你说的或者更聪明的东西。编辑:一件事 - 在我选择一个随机点及其对称点并将集群分成两个集群之后 - 没有对该集群进行优化?就像在常规 k-means 中一样,总是有优化,直到集群之间的点没有移动(或者移动小于 1% ...)

以上是关于Bisecting k-means 聚类算法解释的主要内容,如果未能解决你的问题,请参考以下文章

Spark2.0机器学习系列之8: 聚类分析(K-Means,Bisecting K-Means,LDA,高斯混合模型)

在大数据量时,K-means算法和层次聚类算法谁更有优势

聚类算法--K-means和k-mediods/密度聚类/层次聚类

聚类算法K-均值聚类(K-Means)算法

KMeans 算法解释及项目中用到的算法

k-means聚类分析 python 代码实现(不使用现成聚类库)