我试图使用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
等
结果说:"所有在一个简单的聚类",虽然这不是聚类,我的数据肯定存在异常值。
我能做对吗?或者我错过了什么?
答案 0 :(得分:1)
当使用DBIDRangeDatabaseConnection
并且不向ELKI提供任何实际数据时,可视化无法产生特别有用的结果(因为它毕竟没有实际数据)。也不能自动评估数据。
“一体化琐碎聚类”是自动尝试可视化数据的工件,但由于上述原因,这不起作用。为未标记的数据自动添加此聚类,以允许某些可视化工作。
有两件事要做:
设置输出处理程序。例如-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
修复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的算法结果;但这种方法会使用一些额外的内存。