如何使用 ELKI 处理稀疏数据?
How to work with sparse data using ELKI?
我正在尝试使用稀疏矩阵作为 ELKI SOD 算法中的输入数据来检测异常值。
我在 howto 和常见问题解答页面中寻找有关稀疏数据的帮助,所以我尝试像这样使用 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 也不会很好地工作)
我正在尝试使用稀疏矩阵作为 ELKI SOD 算法中的输入数据来检测异常值。 我在 howto 和常见问题解答页面中寻找有关稀疏数据的帮助,所以我尝试像这样使用 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 也不会很好地工作)