2013-07-16 197 views
0

我正尝试使用ELKI进行异常值检测;我有我的自定义距离矩阵,我试图将它输入到ELKI以执行LOF(例如,第一次)。ELKI - 输入距离矩阵

我尝试关注http://elki.dbs.ifi.lmu.de/wiki/HowTo/PrecomputedDistances,但这并不是很清楚。我做什么:

  • 我不希望加载从数据库中的数据,所以我使用:

    -dbc DBIDRangeDatabaseConnection -idgen.count 100 
    

    (其中100是对象的数量,我会分析)

  • 我用LOF算法中并调用外部距离文件

    -algorithm outlier.LOF 
    -algorithm.distancefunction external.FileBasedDoubleDistanceFunction 
    -distance.matrix testData.ascii -lof.k 3 
    

我的距离文件如下(用于测试目的很简单)

0 0 0 
0 1 1 
0 2 0.2 
0 3 0.1 
1 1 0 
1 2 0.9 
1 3 0.9 
2 2 0 
2 3 0.2 
3 3 0 
4 0 0.23 
4 1 0.97 
4 2 0.15 
4 3 0.07 
4 4 0 
5 0 0.1 
5 1 0.85 
5 2 0.02 
5 3 0.15 
5 4 0.1 
5 5 0 
6 0 1 
6 1 1 
6 2 1 
6 3 1 

结果说:“都在一个平凡的集群”,虽然这不是群集和有绝对是离群我的数据。

我做的东西是否正确?或者我错过了什么?

回答

1

当使用DBIDRangeDatabaseConnection,并且没有给ELKI任何实际数据时,可视化不能产生特别有用的结果(因为它毕竟没有实际数据)。数据也不能自动评估。

“所有在一个微不足道的聚类”是自动尝试可视化数据的工件,但由于上述原因,这是行不通的。该群集会自动添加到未标记的数据中,以允许一些可视化工作。

有两件事情给你做:

  1. 设定的输出处理程序。例如-resulthandler ResultWriter,这将产生一个输出与此类似:

    ID=0 lof-outlier=1.0 
    

    ID=是对象号,和lof-outlier=是LOF离群值的分数。

    或者,您可以实现您自己的输出处理程序。在此处找到一个示例: http://elki.dbs.ifi.lmu.de/browser/elki/trunk/src/tutorial/outlier/SimpleScoreDumper.java

  2. 修复DBIDRangeDatabaseConnection。然而,你被ELKI 0.6.0〜beta1中的一个bug所困扰:DBIDRangeDatabaseConnection实际上并没有正确地初始化它的参数。 琐碎的bug修复(参数不正确地在构造函数初始化)是在这里:

    http://elki.dbs.ifi.lmu.de/changeset/11027/elki

    或者,您可以创建一个虚拟输入文件,并使用常规的文本输入。包含文件

    0 
    1 
    2 
    ... 
    

    应该做的伎俩。使用-dbc.in numbers100.txt -dbc.filter FixedDBIDsFilter -dbc.startid 0。后面的参数是让你的ID从0开始,而不是1(默认)。

    此替代方法会产生略微不同的输出格式:

    ID=0 0.0 lof-outlier=1.0 
    

    在附加列是从虚拟文件。当使用外部距离函数时,虚拟值不会影响LOF的算法结果;但是这种方法会使用一些额外的内存。