2015-01-28 4 views
1

Я пишу код Java для обнаружения вредоносных программ с использованием методов сбора данных (кластеризация kmeans). Я использую библиотеку jnetpcap для обнюхивания пакетов для ее анализа, затем в методе nextpacket Я пишу алгоритм кластеризации kmeans для первого пакета.weka java code kmeans clustering

Алгоритм работает хорошо, так как он создает объекты класса Instances с конкретными атрибутами, которые будут основываться на них на кластере, но на следующем пакете этот код не может быть запущен снова, поскольку он генерирует исключение.

код, я использую это:

for(int dim = 0; dim < numDimensions; dim++) 
{ 
    Attribute current = new Attribute("Attribute" + dim , dim); 

    if(dim == 0) 
    { 
     for(int obj = 0; obj < numInstances; obj++) 
     { 
      // instances.add(new SparseInstance(numDimensions)); 
      instances.add(new DenseInstance(numDimensions)); 
     } 
    } 

    for(int obj = 0; obj < numInstances; obj++) 
    { 
     instances.get(obj).setValue(current, (Double)data[dim+1][obj]); 
    } 

    atts.add(current); 
} 

Instances newDataset = new Instances("Dataset" , atts, instances.size());  //this is the line that throws the exception 

for(Instance inst : instances) 
    newDataset.add(inst); 
SimpleKMeans kMeans = new SimpleKMeans(); 
kMeans.setNumClusters(2); 
// kMeans.setMaxIterations(4); 
kMeans.buildClusterer(newDataset); 
// int clusterNumbers; 
// clusterNumbers=kMeans.numberOfClusters(); 
for (int j=0;j<numInstances;j++) 
{ 
    int classif=kMeans.clusterInstance(newDataset.get(j)); 
    // double []distr=kMeans.distributionForInstance(newDataset.firstInstance()); 
    System.out.println(classif); 
    // System.out.println(distr[0]); 
    // System.out.println(distr[1]); 
    ArrayList<Double> temp5=flowFeatures.get((JFlowKey)data[0][j]); 
    if (classif==0) 
    { 
     // instances0.add(newDataset.get(j)); 
     instance0FlowFeatures.put((JFlowKey)data[0][j], temp5); 
    } 
    else if(classif==1) 
    { 
     //instances1.add(newDataset.get(j)); 
     instance1FlowFeatures.put((JFlowKey)data[0][j], temp5); 
    } 
} 

И исключение я вижу это:

java.lang.IllegalArgumentException: Attribute names are not unique! Causes: 'Attribute0' 'Attribute1' 'Attribute2' 'Attribute3' 'Attribute4' 'Attribute5' 'Attribute6' 'Attribute7' 'Attribute0' 'Attribute1' 'Attribute2' 'Attribute3' 'Attribute4' 'Attribute5' 'Attribute6' 'Attribute7' 

Может кто-нибудь, пожалуйста, помогите мне, пожалуйста?

+2

Где произносится 'atts'? Вы очищаете или создаете новый экземпляр каждый раз? Если вы этого не сделаете, у вас будут повторяющиеся атрибуты, добавленные в 'atts' каждый раз, когда вы пройдете этот первый цикл for-loop. –

+0

Как я могу очистить atts? –

ответ

0

Подумайте об атрибутах, таких как столбцы таблицы, и их необходимо создать один раз.

Вот код для одномерных данных. В этом примере моя воображаемая таблица имеет один столбец как «attr1», а таблица имеет 3 записи (экземпляры) в ней, сохраняя очень простую информацию о структуре.

 Attribute attr1 = new Attribute("attr1");        
     ArrayList<Attribute> attrList = new ArrayList<Attribute>();    
     attrList.add(attr1);     

     Instances dataset = new Instances("test", attrList, 0); 

     double[] val1 = new double[] { 1.2}; 
     double[] val2 = new double[] { 2.2}; 
     double[] val3 = new double[] { 1.4}; 

     Instance instance0 = new DenseInstance(1.0, val1); 
     instance0.setDataset(dataset); 

     Instance instance1 = new DenseInstance(1.0, val2); 
     instance1.setDataset(dataset); 

     Instance instance2 = new DenseInstance(1.0, val3); 
     instance2.setDataset(dataset); 

     dataset.add(instance0);  
     dataset.add(instance1); 
     dataset.add(instance2); 

     SimpleKMeans kmeans = new SimpleKMeans();    
     try { 
      kmeans.setPreserveInstancesOrder(true); 
      kmeans.setNumClusters(2); 
      kmeans.setSeed(2); 
      kmeans.setDontReplaceMissingValues(true); 
      kmeans.buildClusterer(dataset); 
      kmeans.setMaxIterations(10);          
      Instances instances = kmeans.getClusterCentroids(); 
      int assignments[] = kmeans.getAssignments(); 
      int x=0; 
      for(int assignment : assignments) { 
       System.out.println("data :" + dataset.get(x) + "instance idx: " + x + " centroid value: " + instances.get(assignment)); 
       x++; 
      } 
     } 
Смежные вопросы