用于距离聚类的 Python 库

Posted

技术标签:

【中文标题】用于距离聚类的 Python 库【英文标题】:Python library for distance clustering 【发布时间】:2012-10-21 06:11:04 【问题描述】:

我正在寻找一个 python 库来将一组坐标组织成簇。我的输入是一个(纬度、经度)坐标列表,我想获得一个根据距离对它们进行分组的集群列表。

我事先不知道我需要获得多少个集群,所以我不能使用 K-Means(比如cluster module)算法(至少不是一个人,也许我有一个算法我可用于根据输入数据获取该数字)。

我也查看了clusterpy,但它似乎对任务来说过于复杂,文档也不是很有指导意义。

【问题讨论】:

也许使用分层集群的集群模块是要走的路。我最初放弃了它,因为我认为我只能使用专有方法,但是对于我拥有的数据集,这可能有点问题。 “我事先不知道我需要获得多少个集群,所以我不能使用 K-Means 之类的东西”您几乎可以肯定使用 k-means,并使用任何计算 k 的许多算法。见en.wikipedia.org/wiki/… 和***.com/questions/1793532/…。 我最终使用了分层算法。由于坐标属于不同社区的地址,并且我想为每个社区获取一个集群,因此算法的合理距离限制足以获得我预期的输出。 【参考方案1】:

您可能想研究DBSCAN (Wikipedia) 和OPTICS (Wikipedia) 等算法。我不知道周围是否有任何好的 Python 实现。我在这里看到的关于 SO for OPTICS 的内容似乎非常不正确和不完整。 DBSCAN 很简单,你可以自己实现。

一些主要好处:

您可以使用大圆距,它更适合 lat/lng 坐标。由于 180° 的环绕,K-means 会出现问题 - 均值不稳定 您需要设置两个阈值:半径 epsilon(仅适用于 DBSCAN),在上述距离的情况下,其单位为公里,并且大致是最小集群大小。根据您的用例,该参数应该很容易设置。 如果有空间索引,可以将算法加速到O(n log n)。 您不需要集群数量的启发式方法!

【讨论】:

【参考方案2】:

我会推荐scikit learn。链接页面对不同的聚类算法进行了很好的讨论。对于地理聚类(正如上面有人已经建议的那样)DBSCAN 效果很好。

【讨论】:

【参考方案3】:

几年前我在基因序列上用 Python 做过一模一样的事情,完全可行。

要从初始数据中获得最佳数量的聚类,您需要在遍历它们时使用惩罚器。 Hastie-Tibshirani-Friedman 所著的 Elements of Statistical Learning 一书中有一个很好的部分解释了如何做到这一点:http://www-stat.stanford.edu/~tibs/ElemStatLearn/

这是我从那里学到的,希望对你有帮助!

【讨论】:

【参考方案4】:

我有一些朋友使用NetWorkX 解决此类问题。它写得很好,文档也很好。

【讨论】:

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

除了 Levenshtein 之外,用于有序词集和后续聚类的更好距离度量

大数据学习笔记:聚类分析

大数据学习笔记:聚类分析

python k-means聚类

机器学习聚类算法总结

将 K 平均聚类距离度量更改为堪培拉距离或 python 上的任何其他距离度量