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

标签 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 的正确方法吗?

最佳答案

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

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

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

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

关于sparse-matrix - 如何使用 ELKI 处理稀疏数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972364/

相关文章:

r - 从数据框中提取具有最高值和最低值的行

java - ELKI DBSCAN : How to set dbc. 解析器?

R:使用 data.table 进行制表和插入

c# - 极稀疏数组的实现

opencv - OpenCV:如何通过不同的角度使用真实场景的图像比较特征检测器和提取器的性能?

algorithm - ELKI(聚类)算法的默认参数设置

cluster-analysis - 在 ELKI 上使用地理距离函数

java - 在 Java 中使用 JMatio 导出非常大的矩阵

python - sklearn svm 中的稀疏预计算 Gram 矩阵?

database - 检测稀疏分布中的异常值?