我正在寻找Python中OPTICS算法的体面实现。我将用它来形成基于密度的点((x,y)对)。
我正在寻找接收(x,y)对并输出群集列表的内容,其中列表中的每个群集都包含属于该群集的(x,y)对列表。
答案 0 :(得分:10)
我不知道完整的和OPTICS的精确python实现。这里发布的链接似乎只是OPTICS理念的粗略近似。他们也没有使用索引进行加速,因此它们将在O(n^2)
中运行,甚至可能在O(n^3)
运行。
原始的OPTICS论文包含将算法输出转换为实际聚类的建议方法:
http://www.dbs.informatik.uni-muenchen.de/Publikationen/Papers/OPTICS.pdf
Weka中的OPTICS实现基本上是 unmaintained ,同样不完整。它实际上不会产生集群,它只计算集群顺序。为此,它复制了数据库 - 它不是真正的Weka代码。
首先发布OPTICS的小组在Java中ELKI似乎有相当广泛的实现。您可能希望针对此“官方”版本测试任何其他实现。
答案 1 :(得分:7)
编辑:以下不知道是OPTICS的完整实现。
我快速搜索并找到了以下内容(Optics)。我不能保证它的质量,但算法似乎很简单,所以你应该能够快速验证/适应它。
以下是如何在光学算法输出上构建聚类的快速示例:
def cluster(order, distance, points, threshold):
''' Given the output of the options algorithm,
compute the clusters:
@param order The order of the points
@param distance The relative distances of the points
@param points The actual points
@param threshold The threshold value to cluster on
@returns A list of cluster groups
'''
clusters = [[]]
points = sorted(zip(order, distance, points))
splits = ((v > threshold, p) for i,v,p in points)
for iscluster, point in splits:
if iscluster: clusters[-1].append(point)
elif len(clusters[-1]) > 0: clusters.append([])
return clusters
rd, cd, order = optics(points, 4)
print cluster(order, rd, points, 38.0)
答案 2 :(得分:6)
虽然技术上不是OPTICS,但在https://github.com/lmcinnes/hdbscan有一个用于python的HDBSCAN *实现。这相当于具有无限最大epsilon的OPTICS和不同的簇提取方法。由于实现提供了对生成的集群层次结构的访问,因此如果您愿意,也可以通过更传统的OPTICS方法从中提取集群。
请注意,尽管不限制epsilon参数,但此实现仍然使用基于kd-tree和ball-tree的最小生成树算法and can handle quite large datasets来实现O(n log(n))性能。
答案 3 :(得分:6)
现在存在库pyclustering,其中包含Python和Python的C ++实现。
答案 4 :(得分:1)
请参阅“基于密度的聚类方法” http://www.chemometria.us.edu.pl/index.php?goto=downloads
答案 5 :(得分:1)
您想要查看空间填充曲线或空间索引。 sfc将2d复杂度降低到1d复杂度。你想看看尼克的希尔伯特曲线四叉树空间索引博客。你想在phpclasses.org(hilbert-curve)下载我的sfc实现。
答案 6 :(得分:1)
现在已在sklearn(用于python的集群和机器学习模块)的开发版本(scikit-learn v0.21.dev0)中实现
这是链接: https://scikit-learn.org/dev/modules/generated/sklearn.cluster.OPTICS.html