用于距离聚类的 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 库的主要内容,如果未能解决你的问题,请参考以下文章