【问题标题】:Obtaining cluster boundaries of ELKI OPTICSXi获取 ELKI OPTICSXi 的集群边界
【发布时间】:2015-06-25 10:22:54
【问题描述】:

我有一个一维数据集,其直方图显示了多个局部最大值,因此我知道我的一维空间中有多个数据更密集的区域。我想确定这些密集区域的边界,以便我对某个数据点所在的密集区域/集群进行分类。为此,我使用 OPTICS,因为它应该能够更好地处理比较集群之间的不同密度到 DBSCAN。

我在 Java 代码中使用 ELKI(0.6.0 版)(我知道 ELKI 团队不建议将 ELKI 嵌入 Java,但我需要为许多数据集重复我的工作流程,因此最好在我的情况)。下面的代码 sn-p 打印集群的开始和结束项的索引。 ELKI documentation on OPTICSModel 没有明确定义这些索引号对应的内容,但我假设这些是数据库增强集群排序中开始和结束数据项的索引(如 OPTICS.run() 的 ClusterOrderResult 对象-已创建),而不是数据库本身的开始和结束数据项的索引(无序)。

ListParameterization opticsParams = new ListParameterization();
opticsParams.addParameter(OPTICSXi.XI_ID, 0.01);
opticsParams.addParameter(OPTICS.MINPTS_ID, 100);
OPTICSXi<DoubleDistance> optics = ClassGenericsUtil.parameterizeOrAbort(OPTICSXi.class, opticsParams);

ArrayAdapterDatabaseConnection arrayAdapterDatabaseConnection = new ArrayAdapterDatabaseConnection(myListOfOneDimensionalFeatureVectors.toArray(new double[myListOfOneDimensionalFeatureVectors.size()][2]));
ListParameterization dbParams = new ListParameterization();
dbParams.addParameter(AbstractDatabase.Parameterizer.INDEX_ID, RStarTreeFactory.class);
dbParams.addParameter(RStarTreeFactory.Parameterizer.BULK_SPLIT_ID, SortTileRecursiveBulkSplit.class);
dbParams.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, arrayAdapterDatabaseConnection);

Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, dbParams);
db.initialize();

result = optics.run(db);
List<Cluster<OPTICSModel>> clusters = result.getAllClusters();
    for(Cluster<OPTICSModel> cluster : clusters){
        if(!cluster.isNoise())
            System.out.println(cluster.getModel().getStartIndex() + ", "+ cluster.getModel().getEndIndex() +";  ");
    }

现在我想知道我的集群在我的一维空间中的哪里开始和结束。因此,我想检索与我上面的代码已经获得的开始和结束索引对应的数据项。我假设我需要一个 ClusterOrderResult 对象,然后我可以从中检索获得的索引。然而,在文档中,似乎无法从我通过调用 optics.run() 获得的聚类结果对象中检索到这样的东西。由于似乎没有办法获得这个有序的数据库,我天真地尝试从我的原始输入数据集中获取索引,而不是用下面的 println 替换上面代码中的 println:

System.out.println(myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getStartIndex())[0] + ", "+ myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getEndIndex())[0] +";  ";

然而,正如我所预料的那样,索引似乎不属于原始输入文件,因为这会定期打印在我的一维空间中值低于结束边界的结束边界。有没有人知道任何方法来获取与 OPTICS 聚类发现的开始和结束索引相对应的原始一维数据值?我想稍后在我的代码中使用这些值。

【问题讨论】:

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


    【解决方案1】:

    为了实现自动化,从命令行调用 ELKI 效果很好。这是我的首选方式,因为这样每次运行都很好地隔离在自己的 JVM 中。

    然后您可以轻松地从输出文件中访问这些数据。

    您为什么使用旧版 ELKI?由于删除了泛型,0.6.5 版本要好得多。虽然我现在已经切换到github版本了。

    如果您想直接访问ClusterOrder 对象,它作为子结果附加到集群对象。您应该可以使用

    ClusterOrder clusterOrder = ResultUtil.filterResults(clustering, ClusterOrder.class).get(0);
    

    及其对象ID通过:

    ArrayDBIDs ids = DBIDUtil.ensureArray(clusterOrder.getDBIDs());
    

    ensureArray 是开销,但无论如何它是一个 noop - 这是一个强制转换或转换操作,在这里它将是一个强制转换;至少在我的 ELKI 版本中,ID 始终存储为 ArrayDBID)

    数组迭代器(DBIDArrayIter it = ids.iter())可以通过seek(offset)移动到一个位置。所以你应该能够使用类似的东西

    DBIDArrayIter it = ids.iter();
    NumberVector vec = relation.get(it.seek(model.getStartIndex()));
    

    ELKI 中的迭代器对于 Java API 来说很奇怪,但如果您对所有访问都使用 单个 迭代器,则速度非常快。

    您的 ELKI 问题部分就这么多。但是,从统计的角度来看在一维数据上使用 OPTICS 是没有意义的。对于一维数据,请改用适当的核密度估计。 OPTICS 是一种粗略而粗略的方法,当您的数据过于复杂而无法使用适当的统计工具进行建模时,它是有意义的。 OPTICS 使用非常原始的核密度,而 xi 方法是从密度图中非常简单地提取簇……至少在一维数据上,统计提供了更强大的工具。 ELKI 有一个名为KNNKernelDensityMinimaClustering 的实现,但我还没有使用它。但是内核密度估计应该可以在任何统计工具包中使用,所以我会尝试这个类。

    【讨论】:

    • 感谢您的回答和您对统计部分的反馈!在尝试 OPTICS 之前,我实际上一直在尝试 KDE 技术。问题在于,在找到一个与数据拟合得很好的 KDE 之后,从中获得聚类仍然远非易事。很高兴听到 KNNKernelDensityMinimaClustering 可能会在这个方向上为我提供一些可能性。您是否知道是否有关于 KNNKernelDensityMinimaClustering 如何根据内核密度计算集群的信息? ELLI 网站上的课程和出版物列表的 Javadoc 似乎没有提供这方面的信息。
    • 不知道。通常它们在 JavaDoc 中有引用,但这个类没有。
    • 我也切换到了 ELKI 的 github 版本。关于您提供的代码 sn-ps 的另一个问题。在您的示例中,变量“关系”的类型是什么?起初我以为是数据库,但是 it.seek 返回一个 DBIDArrayIter 类型的对象,将数据库放在那里会导致错误“get(DBIDArrayIter) underfined for type Database”。
    • 我自己修好了。我发现我可以使用 getRelations() 方法从 Dabase 对象中提取 Collection
    • 对不起,KNNKernelDensityMinimaClustering 是基于我自己的考虑,我找不到支持它的参考;然而,该方法过于简单,无法在任何地方发布。如果您使用此方法,请引用 ELKI。
    猜你喜欢
    • 2013-12-19
    • 2015-09-18
    • 2013-12-02
    • 2017-08-10
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多