2015-01-28 5 views
1

데이터 마이닝 기술 (kmeans 클러스터링)을 사용하여 맬웨어 탐지를위한 Java 코드를 작성합니다. 패킷을 스니핑 (sniffing)하기 위해 jnetpcap 라이브러리를 사용하여 분석 한 다음, nextpacket 메소드에서 첫 번째 패킷에 대해 kmeans 클러스터링 알고리즘을 작성합니다.weka java 코드 kmeans 클러스터

알고리즘은 Instances 클래스의 객체를 생성 할 때 잘 작동하지만 다음 패킷에서는 예외를 throw 할 때이 코드를 다시 실행할 수 없습니다.

내가 사용하는 코드는 이것이다 :

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'는 어디에 선언 되었습니까? 매번 새로운 인스턴스를 생성 하시겠습니까? 그렇지 않으면 첫 번째 for-loop를 수행 할 때마다'atts'에 중복 속성이 추가됩니다. –

+0

어떻게 atts를 지울 수 있습니까? –

답변

0

테이블의 열과 같은 속성을 생각하면 한 번 만들어야합니다.

다음은 1 차원 데이터 코드입니다. 이 예제에서는 가상 테이블에 "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++; 
      } 
     } 
관련 문제