在elki中稀疏矢量的kmeans

时间:2016-01-19 11:34:01

标签: java k-means outliers elki

当我使用密集矢量数据尝试此方法时,它正确运行,但是使用稀疏矢量数据会抛出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);
...

1 个答案:

答案 0 :(得分:1)

班级ArrayAdapterDatabaseConnection只能 用于密集向量。您必须提供 square double[][]数组。

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

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

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