2014-12-17 2 views
2
SimpleKMeans kmeans = new SimpleKMeans(); 
    int numberOfClusters = 2; 
    int[] assignments = null; 

    kmeans.setSeed(10); 

    // This is the important parameter to set 
    kmeans.setPreserveInstancesOrder(true); 
    try { 
     kmeans.setNumClusters(numberOfClusters); 
     kmeans.buildClusterer(instancesOne); // <-- exception being thrown 
     // This array returns the cluster number (starting with 0) for each instance 
     // The array has as many elements as the number of instances 
     assignments = kmeans.getAssignments(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Я пытаюсь инициализировать параметры алгоритма EM алгоритмом k-средних. Поэтому я пытаюсь получить 2 центроида, в которых я могу дополнительно подготовить параметры для GMM. Однако я получаю следующую ошибку:Java/WEKA: K Ошибка кластеризации: не удается обработать атрибут класса

weka.core.WekaException: weka.clusterers.SimpleKMeans: Cannot handle any class attribute! 
    at weka.core.Capabilities.test(Unknown Source) 
    at weka.core.Capabilities.test(Unknown Source) 
    at weka.core.Capabilities.testWithFail(Unknown Source) 
    at weka.clusterers.SimpleKMeans.buildClusterer(Unknown Source) 
    at hmm.HMM.run(HMM.java:62) 
    at hmm.HMM.main(HMM.java:22) 
Exception in thread "main" java.lang.NullPointerException 
    at hmm.HMM.run(HMM.java:71) 
    at hmm.HMM.main(HMM.java:22) 

Также как установить два случайных центроида для начала. Я думаю, что метод setSeed() делает это, но как мне получить слово с моим набором данных? Мой файл CSV выглядит так:

enter image description here

И загрузить его так:

Instances instancesOne = loader.loadCsv("train", "class1"); 

Вот некоторая информация об атрибутах при загрузке:

dataset: 

@relation class1 

@attribute x numeric 
@attribute y numeric 

@data 
-9.0278,3.1518 
-9.5656,3.6383 
-9.805,3.8284 
etc... 

ответа, этот код был необходим, чтобы сделать экземпляры class-less (удалить атрибут класса):

// remove class attribute, make class-less 
Instances dataClusterer = null; 
weka.filters.unsupervised.attribute.Remove filter = new weka.filters.unsupervised.attribute.Remove(); 
filter.setAttributeIndices("" + (instancesOne.classIndex() + 1)); 
try { 
    filter.setInputFormat(instancesOne); 
    dataClusterer = Filter.useFilter(instancesOne, filter); 
} catch (Exception e1) { 
    e1.printStackTrace(); 
    return; 
} 
+0

Где исключение вызывается в вашем коде? –

+0

@MatthewSpencer Обновленный вопрос, возьмите пик! –

ответ

0

Я не считаю, что кластеризация K-Means требует атрибута класса. Если вы установили его для своих экземпляров, попробуйте удалить его и повторить код. This guide может помочь в методах построения модели кластеризации.

Надеюсь, это поможет!

+1

Странно. Я получаю ту же ошибку с подходом EM в указанной вами ссылке. Как удалить этот атрибут класса, это, кажется, корень зла! –

+0

Вы были правы, мне пришлось вручную удалить атрибут класса. –

Смежные вопросы