【问题标题】:How to work with sparse data using ELKI?如何使用 ELKI 处理稀疏数据?
【发布时间】:2015-05-12 09:37:44
【问题描述】:

我正在尝试使用稀疏矩阵作为 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 的正确方法吗?

【问题讨论】:

    标签: sparse-matrix outliers elki


    【解决方案1】:

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

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

    您可以使用SparseVectorFieldFilter 强制数据为固定维度。

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

    【讨论】:

    • 那么,你建议什么算法?
    • 我忘了说这是一个高维数据集,因为这个我用过SOD算法
    • SOD 本质上是为密集的高维数据设计的。在稀疏数据上,如果您有可靠的距离(例如,在文本数据上,余弦可能会起作用),那么一些经典的基于距离和密度的方法可能会起作用。 SOD 是为您具有对检测异常值无用的噪声(非零!)属性而设计的;但是这些属性会降低距离函数的性能。
    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多