0

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

我尝试关注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  

ETC

结果说:“所有在一个微不足道的聚类中”,虽然这不是聚类,而且我的数据中肯定存在异常值。

我做的对吗?或者我错过了什么?

4

1 回答 1

1

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

“all in one trivial clustering”是自动尝试可视化数据的产物,但由于上述原因,这不起作用。为未标记的数据自动添加此聚类,以允许某些可视化工作。

有两件事可以为您做:

  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 中的一个错误所困扰:DBIDRangeDatabaseConnection实际上没有正确初始化其参数。微不足道的错误修复(在构造函数中未正确初始化参数)在这里:

    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 的算法结果;但是这种方法会使用一些额外的内存。

于 2013-07-17T09:03:53.373 回答