qqilihq
qqilihq

Reputation: 11464

MOA's StreamKM clustering doesn't return any result

I'm currently trying to cluster a great amount of data points into a given amount of clusters and I wanted to try MOA's streaming based k-means StreamKM. A very simple example of what I'm trying to do using random data looks as follows:

StreamKM streamKM = new StreamKM();
streamKM.numClustersOption.setValue(5); // default setting
streamKM.widthOption.setValue(100000); // default setting
streamKM.prepareForUse();
for (int i = 0; i < 150000; i++) {
    streamKM.trainOnInstanceImpl(randomInstance(2));
}
Clustering result = streamKM.getClusteringResult();
System.out.println("size = " + result.size());
System.out.println("dimension = " + result.dimension());

The random instances are created as follows:

static DenseInstance randomInstance(int size) {
    DenseInstance instance = new DenseInstance(size);
    for (int idx = 0; idx < size; idx++) {
        instance.setValue(idx, Math.random());
    }
    return instance;
}

However, when running the given code, no clusters seem to be created:

System.out.println("size = " + result.size()); // size = 0
System.out.println("dimension = " + result.dimension()); // NPE

Is there anything else I need to take care of, or do I have a fundamental misunderstanding of the MOA clustering concepts?

Upvotes: 3

Views: 294

Answers (1)

Mustafa Celik
Mustafa Celik

Reputation: 2399

I think prepareForUse() method is not the correct method that initialize the algorithm.

Instead of streamKM.prepareForUse(); , you should use streamKM.resetLearning();.

In short, your code should be like:

StreamKM streamKM = new StreamKM();
streamKM.numClustersOption.setValue(5); // default setting
streamKM.widthOption.setValue(100000); // default setting
streamKM. resetLearning(); // UPDATED CODE LINE !!!
for (int i = 0; i < 150000; i++) {
    streamKM.trainOnInstanceImpl(randomInstance(2));
}
Clustering result = streamKM.getClusteringResult();
System.out.println("size = " + result.size());
System.out.println("dimension = " + result.dimension());

Upvotes: 2

Related Questions