如何使用ELKI处理稀疏数据?

时间:2015-03-10 19:23:40

标签: sparse-matrix outliers elki

我正在尝试使用稀疏矩阵作为ELKI SOD算法中的输入数据来检测异常值。 我正在寻找关于稀疏数据的howto和faqs页面的帮助,所以我试图像这样使用SparseNumberVectorLabelParser和SparseVectorFieldFilter:

//data is a mxn matrix    
ArrayAdapterDatabaseConnection dataArray = new ArrayAdapterDatabaseConnection(data);
SparseDoubleVector.Factory sparseVector = new SparseDoubleVector.Factory();
SparseNumberVectorLabelParser<SparseDoubleVector> parser = new SparseNumberVectorLabelParser<SparseDoubleVector>(Pattern.compile("s*[,;s]s*")," \" ",Pattern.compile("^s*(#|//|;).*$"),null, sparseVector);
SparseVectorFieldFilter<SparseDoubleVector>  sparseFilter = new SparseVectorFieldFilter<SparseDoubleVector>();

ListParameterization params = new ListParameterization();
params.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, dataArray);
params.addParameter(AbstractDatabaseConnection.Parameterizer.PARSER_ID, parser);
params.addParameter(AbstractDatabaseConnection.Parameterizer.FILTERS_ID, sparseFilter);
Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, params);
db.initialize();

params = new ListParameterization();
params.addParameter(SOD.Parameterizer.KNN_ID, 25);
params.addParameter(SharedNearestNeighborPreprocessor.Factory.NUMBER_OF_NEIGHBORS_ID, 10);
SOD<DoubleVector> sodAlg = ClassGenericsUtil.parameterizeOrAbort(SOD.class, params);
OutlierResult result = sodAlg.run(db); 

但我有这个运行时异常:

Exception in thread "main" de.lmu.ifi.dbs.elki.data.type.NoSupportedDataTypeException: No data type found satisfying: NumberVector,field
Available types: DBID DoubleVector,field,mindim=7606,maxdim=12968
at de.lmu.ifi.dbs.elki.database.AbstractDatabase.getRelation(AbstractDatabase.java:154)
at de.lmu.ifi.dbs.elki.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.java:80)

这是在java代码中使用SparseNumberVectorLabelParser和SparseVectorFieldFilter的正确方法吗?

1 个答案:

答案 0 :(得分:2)

ArrayAdapterDatabaseConnection专为密集数据而设计。对于稀疏数据,首先将其编码为密集阵列,然后将其重新编码为稀疏矢量没有多大意义。考虑直接将数据读取为稀疏向量以避免开销。

您看到的错误有不同的原因: SOD在固定维度的矢量场上指定,但稀疏矢量产生具有变量维度的关系。因此它找不到请求的数据类型(因此,NoSupportedDataTypeException)。

您可以使用SparseVectorFieldFilter强制数据具有固定的维度。

但我不确定SOD是否适用于稀疏数据。即使它应该工作,运行时和性能可能会很糟糕;因为该算法不对满足其设计假设的数据进行操作。稀疏数据通常最好使用利用和处理数据稀疏性的算法来处理。 (也就是说,你也可以使用欧几里德距离来计算共享的最近邻居,这对于稀疏数据可能效果不好。如果SNN不好,SOD也不能正常工作)