我在ELKI环境中使用OPTICS实现时遇到问题.我在DBSCAN实现中使用了相同的数据,它就像一个魅力.可能我错过了一些带参数的东西,但我无法弄明白,一切似乎都是正确的.
数据是一个简单的300х2矩阵,由3个簇组成,每个簇有100个点.
DBSCAN结果:
MinPts = 10,Eps = 1
光学结果:
MinPts = 10
我正在尝试使用ELKI使用OPTICS聚类地理定位数据集.我已经明白要提取簇,我需要使用OPTICSXi算法而不是OPTICS,它只计算簇顺序.
我想知道你是否可以给我更多关于参数xi如何工作的信息.我将此值固定为0.009,但是以随机的方式.
我正试图在JAVA中使用ELKI来运行DBSCAN.为了测试,我使用了FileBasedDatabaseConnection.现在我想用自定义对象作为参数运行DBSCAN.
我的对象具有以下结构:
public class MyObject {
private Long id;
private Float param1;
private Float param2;
// ... and more parameters as well as getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我想使用List<MyObject>as数据库在ELKI中运行DBSCAN ,但是只应考虑一些参数(例如,使用参数param1,param2和param4在对象上运行DBSCAN).理想情况下,生成的集群包含整个对象.
有没有办法实现这种行为?
如果没有,我如何将对象转换为ELKI理解的格式,并允许我将生成的集群对象与我的自定义对象进行匹配(即,是否有一种以编程方式设置标签的简单方法)?
以下问题涉及featureVectors:在自定义对象上使用ELKI并理解结果
这可能是我的问题的可能解决方案吗?如何创建一个特征向量List<MyObject>?
我编写了自己的LOF实现,并且我试图将结果与ELKI和RapidMiner中的实现进行比较,但所有3都给出了不同的结果!我想弄清楚为什么.
我的参考数据集是一维的,102个实数值,有许多重复.我会尝试在下面发布.
首先,RapidMiner实现.LOF分数与ELKI和我的结果大不相同; 许多人带着无穷大的LOF回来.此实施是否已经过验证是正确的?
我的结果与ELKI类似,但我没有得到完全相同的LOF值.通过快速扫描ELKI源代码中的注释,我认为这可能是因为计算k邻域的方式不同.
在LOF文件中,MinPts参数(在别处称为k)指定最小值.要包括在k-neighborhood中的点数.在ELKI实现中,我认为他们将k邻域定义为k个点而不是k距离或k个不同距离内的所有点.任何人都可以确切地确认ELKI如何构建k-neighborhood?还有一个私有变量允许点本身包含在它自己的邻域中,但看起来默认不包括它.
有没有人知道一个公共参考数据集,其中附有LOF分数用于验证目的?
---更多细节如下---
参考:ELKI源代码在这里:
http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/de/lmu/ifi/dbs/elki/algorithm/outlier/lof/LOF.java
RapidMiner源代码在这里:
这是我的测试数据集:
4.32323 5.12595 5.12595 5.12595 5.12595 5.7457 5.7457 5.7457 5.7457 5.7457 5.7457 5.97766 5.97766 6.07352 6.07352 6.12015 6.12015 6.12015 6.44797 6.44797 6.48131 6.48131 6.48131 6.48131 6.48131 6.48131 6.6333 6.6333 6.6333 6.70872 6.70872 6.70872 6.70872 6.70872 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 6.77579 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.03654 7.10361 7.10361 7.10361 …
我对检测密度变化的区域中的集群感兴趣,例如用户在城市中生成的数据,为此,我采用了OPTICS算法。
与DBSCAN不同,OPTICS算法不会产生严格的集群分区,而是会增加数据库的顺序。为了产生群集分区,我使用OPTICSxi,这是另一种基于OPTICS输出产生分类的算法。几乎没有能够从OPTICS输出中提取集群分区的库,而ELKI的OPTICSxi实现就是其中之一。
对我来说很清楚,如何解释DBSCAN的结果(尽管设置“有意义的”全局参数不是那么容易)。DBSCAN检测到簇的“原型”,其特征是密度,表示为每个区域的点数(分钟/ε)。OPTICSxi的结果似乎很难解释。
我有时会在OPTICSxi的输出中检测到两种现象,而我无法解释。一种是“尖峰”簇的外观,它们链接了地图的各个部分。我无法解释它们,因为它们似乎由很少的点组成,而且我不理解算法是如何决定将它们分组在同一群集中的。它们真的代表密度变化的“走廊”吗?查看基础数据,看起来不是那样。您可以在下面的图像中看到这些“尖峰”。

我无法解释的另一个现象是,有时存在相同层次级别的“重叠”集群。OPTICSxi基于数据库的OPTICS排序(例如树状图),该图中没有重复的点。
由于这是分层聚类,因此我们认为较低级别的群集包含较高级别的群集,并且在构建凸包时会强制执行该想法。但是,我看不出有在同一个层次上与其他集群相交的集群的任何理由,这实际上意味着某些点将具有双重集群“成员资格”。在下面的图像中,我们可以看到一些具有相同层次级别(0)的相交群集。

最后,我想让您留下的最重要的想法/问题是:我们希望在OPTICSxi聚类分类中看到什么?这个问题与参数OPTICSxi的任务紧密相关。
由于我几乎看不到针对特定聚类问题进行OPTICSxi的研究,因此我很难找到最佳聚类分类。即:可以提供一些有意义/有用的结果,并为DBSCAN集群增加一些价值的方法。为了帮助我回答这个问题,我使用不同的参数组合进行了多次OPTICSxi运行,并选择了三个参数进行讨论。

在此运行中,我使用了较大的epsilon(2Km)。该值的含义是我们接受大型群集(最大2Km);由于算法“合并”了簇,因此我们最终会得到一些非常大的簇,这些簇几乎肯定具有低密度。我喜欢此输出,因为它公开了分类的层次结构,并且实际上使我想起了DBSCAN的多个运行,它们具有不同的参数组合(针对不同的密度),这是OPTICS的广告“强度”。如前所述,较小的群集对应于层次结构级别中的较高级别和较高的密度。

在此运行中,即使“ contrast”参数与上一次运行相同,我们也会看到大量的簇。这主要是因为我选择的Minpts数量较少,这表明我们接受的点数较少的聚类。由于这种情况下的epsilon较短,因此我们看不到这些大簇占据了地图的很大一部分。我发现此输出不如前一个有趣,这主要是因为,即使我们具有分层结构,在同一级别上也有许多聚类,并且其中许多相交。在解释方面,我可以看到一个与上一个相似的整体“形状”,但实际上在许多小簇中却离散了,这些簇很容易被忽略为“噪音”。

此运行具有一个与上一个相似的参数选择,不同之处在于分钟数更大。结果是,不仅我们发现了更少的集群,而且它们的重叠较少,而且它们大多处于同一水平。
从为DBSCAN增加价值的角度来看,我将选择第一个参数组合,因为它提供了数据的层次结构图,清楚地显示了哪些区域更密集。恕我直言,最后一个参数组合无法提供密度的整体分布的概念,因为它在整个研究区域内都发现了相似的簇。我有兴趣阅读其他意见。
cluster-analysis hierarchical-clustering dbscan elki optics-algorithm
我需要以编程方式使用 ELKI 来运行 k-medoids 聚类算法。我有一个相似度矩阵,我希望输入到算法中。
是否有任何代码片段可用于如何运行 ELKI 算法?我基本上需要知道如何创建Database和Relation对象,创建自定义距离函数,并读取算法输出。
不幸的是,ELKI 教程 ( http://elki.dbs.ifi.lmu.de/wiki/Tutorial ) 侧重于 GUI 版本和实现新算法,并且试图通过查看 Javadoc 来编写代码令人沮丧。
如果有人知道任何易于使用的 k-medoids 库,这也可能是这个问题的一个很好的答案。
我有 100,000 个点,我想使用 ELKI 中的 OPTICS 算法进行聚类。对于这个点集,我有一个大约 50 亿个条目的上三角距离矩阵。在ELKI想要矩阵的格式中,大约需要100GB的内存。我想知道 ELKI 是否处理这种数据加载?任何人都可以确认您之前是否做过这项工作?
我正在使用ELKI我KMeansLloyd<NumberVector> with k=3 每次运行我的java代码时使用的数据集群我得到完全不同的集群结果,这是正常的还是我应该做些什么来使我的输出几乎稳定?这里是我从elki教程获得的代码
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(a);
// Create a database (which may contain multiple relations!)
Database db = new StaticArrayDatabase(dbc, null);
// Load the data into the database (do NOT forget to initialize...)
db.initialize();
// Relation containing the number vectors:
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
// We know that the ids must be a continuous range:
DBIDRange ids = (DBIDRange) rel.getDBIDs();
// K-means should be used with squared Euclidean (least squares):
//SquaredEuclideanDistanceFunction dist = SquaredEuclideanDistanceFunction.STATIC; …Run Code Online (Sandbox Code Playgroud)