Java elki中具有稀疏向量的k均值

Java elki中具有稀疏向量的k均值,java,k-means,outliers,elki,Java,K Means,Outliers,Elki,当我使用密集向量数据尝试此方法时,它可以正确运行,但使用稀疏向量数据会抛出java.lang.ArrayIndexOutOfBoundsException。我可以使用什么数据源正确读取稀疏向量数据 public void runKmeans(double[][] data) { ArrayAdapterDatabaseConnection dataArray = new ArrayAdapterDatabaseConnection(data); ListParameterization par

当我使用密集向量数据尝试此方法时,它可以正确运行,但使用稀疏向量数据会抛出
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);
...
public void runKmeans(双[][]数据){
ArrayAdapterDatabaseConnection dataArray=新的ArrayAdapterDatabaseConnection(数据);
ListParameterization params=新建ListParameterization();
addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID,dataArray);
数据库db=ClassGenericsUtil.parameterioRabort(StaticArrayDatabase.class,params);
db.initialize();
//参数化
//params=新的ListParameterization();
params=新的ListParameterization();
参数addParameter(KMeans.K_ID,K);
params.addParameter(KMeans.SEED_ID,0);
//设置算法
KMeansOutlierDetection kmeansAlg=ClassGenericsUtil.ParametereoRaPort(KMeansOutlierDetection.class,params);
//testParameterizationOk(参数);
//在数据库上运行KMEANS
OutlierResult结果=kmeansAlg.run(db);
...
该类只能用于密集向量。您必须提供一个正方形
双[][]
数组

您可以使用
FileBasedDatabaseConnection
ArffParser
读取稀疏数据。也可以实现自己的方法,它只是一个方法,
loadData()

是密集数据类型。是稀疏向量类型。为此,
DoubleVector
使用密集的
double[]
数组进行备份,而
SparseDoubleVector
使用具有非零维度的
int[]
加上仅具有非零值的
double[]


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

如果我没有弄错的话,
ArrayAdapterDatabaseConnection
仅支持密集数据。
DoubleVector
也是一个密集数据集ype.有没有可能你误解了
数据的格式
?除此之外,K-means对稀疏数据没有意义。无论你想做什么,它都是错误的算法。我首先使用ArrayList读取,所以,我使用了toArray方法来填充它。我尝试使用kmeans,因为当我使用Elki的Gui时,kmeans可以运行我的解析arff格式的数据。为什么通过Elki的Gui可以运行Kmeans,但是通过代码cannotOf当然你可以编写代码,但是这些类不能这样做。A
double[]
是一种密集格式。您可以构建自己的数据源,或使用Arff数据源,或,或,或,或,…但最终,k-means从理论角度假设密集数据。为了解释为什么k-means对稀疏数据没有意义:k-means使用平均值。它也假设固定维度d。平均不同长度的稀疏向量gth消除了对该算法的所有良好数学支持。