Python 聚类算法

Posted

技术标签:

【中文标题】Python 聚类算法【英文标题】:Python Clustering Algorithms 【发布时间】:2013-11-26 05:53:50 【问题描述】:

我一直在 scipy 和 sklearn 中寻找针对我遇到的特定问题的聚类算法。我需要某种方法将 N 个粒子群表征为 k 个组,其中 k 不一定知道,除此之外,没有已知的先验链接长度(类似于 question)。

我已经尝试过 kmeans,如果您知道需要多少个集群,它会很有效。我试过 dbscan,除非您告诉它是停止寻找(或开始寻找)集群的特征长度尺度,否则效果不佳。问题是,我可能有数千个这样的粒子簇,我不能花时间告诉 kmeans/dbscan 算法它们应该如何处理。

以下是 dbscan 查找内容的示例:

您可以看到这里确实有两个独立的粒子群,虽然调整了 epsilon 因子(相邻簇之间的最大距离参数),但我根本无法看到这两个粒子群。

还有其他算法可以在这里工作吗?我正在寻找最少的信息 - 换句话说,我希望算法能够就什么可以构成一个单独的集群做出“智能”决策。

【问题讨论】:

【参考方案1】:

使用 DBSCAN 时,它可以帮助缩放/标准化数据或 预先确定距离,以便对 epsilon 的估计是相对的。

有一个 DBSCAN 的实现 - 我认为它是一个 Anony-Mousse 某处表示为“漂浮” - ,它来了 具有 epsilon 估计函数。只要不喂它,它就可以工作 使用大型数据集。

github上有几个incomplete versions的OPTICS。可能是 你可以找到一个来适应你的目的。仍然 试图弄清楚我自己,minPts 有什么影响,使用一个和 相同的提取方法。

【讨论】:

【参考方案2】:

我找到了一个不需要先验信息/猜测并且非常适合我要求它做的事情。它被称为Mean Shift,位于SciKit-Learn。它也相对较快(与亲和传播等其他算法相比)。

这是它给出的一个例子:

我还想指出,在文档中指出它可能无法很好地扩展。

【讨论】:

根据您选择的 Mean Shift 内核,您可以稍微加快速度。这是一篇不错的文章,描述了一些优化,您可以使用这些优化来使均值偏移更具可扩展性。 sociograph.blogspot.com/2011/11/… 感谢您的信息 - 我会检查一下。 MeanShift 需要 bandwidth 作为输入,对我来说听起来不像“没有先验”信息? 如果你不提供一个,特定的实现会为你选择一个。最重要的是,它不需要选择集群的数量。【参考方案3】:

您的绘图表明您选择的minPts 参数方式太小了。

看看OPTICS,它不再需要DBSCAN的epsilon参数了。

【讨论】:

是的,对于这张照片,你说的是真的 - 我已经玩过 minpoints 和 epsilon,但无济于事。我会检查光学。你有参考吗? 它在***上,并包含在 ELKI 中。 谢谢 - 我真的希望有一个 Python 函数/库而不是 Java。 我见过它的 python 版本,但它被严重破坏了;事实上,它又在做 DBSCAN,而不是 OPTICS。【参考方案4】:

您可以尝试最小生成树(zahn 算法),然后删除类似于 alpha 形状的最长边。我将它与 delaunay 三角剖分和凹壳一起使用:http://www.phpdevpad.de/geofence。您也可以尝试分层集群,例如 clusterfck。

【讨论】:

clusterfck 是一个带有 k-means 和分层集群的 js 库。它计算最近邻。

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

建议收藏!10 种 Python 聚类算法完整操作示例

看完这篇文章,包你懂得如何用Python实现聚类算法的层次算法!

DBSCAN密度聚类算法(理论+图解+python代码)

大数据项目13(Python实现聚类算法)

层级聚类算法python实现

Kmeans聚类算法及其 Python实现