我正在尝试使用稀疏矩阵作为 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/