2

当我使用密集向量数据尝试此方法时,它可以正确运行,但会抛出稀疏向量数据java.lang.ArrayIndexOutOfBoundsException。我可以使用什么数据源来正确读取稀疏向量数据?

public void runKmeans(double[][] data) {
ArrayAdapterDatabaseConnection dataArray = new ArrayAdapterDatabaseConnection(data);

ListParameterization params = new ListParameterization();
params.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, dataArray);

Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, params);
db.initialize();


// Parameterization
//params = new ListParameterization();
params = new ListParameterization();
params.addParameter(KMeans.K_ID, k);
params.addParameter(KMeans.SEED_ID, 0);


// setup Algorithm
KMeansOutlierDetection<DoubleVector> kmeansAlg = ClassGenericsUtil.parameterizeOrAbort(KMeansOutlierDetection.class, params);
//testParameterizationOk(params);

// run KMEANS on database
OutlierResult result = kmeansAlg.run(db);
...
4

1 回答 1

1

该类ArrayAdapterDatabaseConnection只能用于密集向量。您必须提供一个方阵 double[][]

您可以使用FileBasedDatabaseConnectionArffParser来读取稀疏数据。或者你可以实现你自己的DatabaseConnection,它只是一个单一的方法,loadData()

DoubleVector密集数据类型。SparseDoubleVector是稀疏向量类型。为此,DoubleVector使用密集double[]数组支持,而SparseDoubleVector使用int[]非零维度的 a,加上double[]非零值的 a 。

K-means需要固定维度来分配平均向量(这些向量总是密集的),因此请确保提供VectorFieldTypeInformation具有最大维度的 a。有一个类型转换过滤器,只需扫描您的数据集一次,并相应地设置维度。

于 2016-01-20T18:05:13.660 回答