Python实现的OPTICS(聚类)算法

时间:2011-04-01 15:43:29

标签: python machine-learning cluster-analysis data-mining optics-algorithm

我正在寻找Python中OPTICS算法的体面实现。我将用它来形成基于密度的点((x,y)对)。

我正在寻找接收(x,y)对并输出群集列表的内容,其中列表中的每个群集都包含属于该群集的(x,y)对列表。

7 个答案:

答案 0 :(得分:10)

我不知道完整的和OPTICS的精确python实现。这里发布的链接似乎只是OPTICS理念的粗略近似。他们也没有使用索引进行加速,因此它们将在O(n^2)中运行,甚至可能在O(n^3)运行。

除了明显的想法之外,OPTICS还有许多棘手的事情。特别是,建议使用相对阈值(“xi”)而不是像这里发布的绝对阈值来完成阈值处理(此时结果将大约是DBSCAN的结果!)。

原始的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