2010-02-16 4 views
6

14 개의 숫자 열을 포함하는 ARFF 파일이 있습니다. 각 열의 값을 (actual_value - min(this_column))/(max(this_column) - min(this_column))으로 수정하여 각 열마다 별도로 정규화를 수행하려고합니다. 따라서 열의 모든 값은 [0, 1] 범위에 있습니다. 한 열의 최소값과 최대 값은 다른 열의 값과 다를 수 있습니다.Weka 정규화 열

Weka 필터로 어떻게 할 수 있습니까?

감사

답변

8

이것은 범위 [0, 1]

+0

내가 정규화했습니다 그냥 출력 정규화 arff 파일 이후와 이전의 분류를 실행할 수 있습니까? (디스크에 저장하고 싶습니다.) – aneuryzm

1

바로 그 것이다 각 열이 필터 모든 값을 적용하면

weka.filters.unsupervised.attribute.Normalize 

를 사용하여 수행 될 수있다. "표준화"와 "표준화"의 차이점에 대해 상기시키고 싶었습니다. 이 질문에서 언급 한 것은 "표준화"인 반면, "정규화"는 가우스 분포를 가정하고 각 속성의 평균 및 표준 편차에 의해 정규화됩니다. 데이터에 이상치가있는 경우 필터를 표준화하면 분 (min) 또는 최대 값 (max)이 다른 인스턴스보다 훨씬 더 클 수 있으므로 데이터 분포가 손상 될 수 있습니다.

+1

아니요, 질문에 맞습니다. 정확히 잘못된 방향으로 설명합니다 : http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

다음은 JA에서 K-Means로 작업 정상화 예입니다.

final SimpleKMeans kmeans = new SimpleKMeans(); 

final String[] options = weka.core.Utils 
     .splitOptions("-init 0 -max-candidates 100 -periodic-pruning 10000 -min-density 2.0 -t1 -1.25 -t2 -1.0 -N 10 -A \"weka.core.EuclideanDistance -R first-last\" -I 500 -num-slots 1 -S 50"); 
kmeans.setOptions(options); 

kmeans.setSeed(10); 
kmeans.setPreserveInstancesOrder(true); 
kmeans.setNumClusters(25); 
kmeans.setMaxIterations(1000); 

final BufferedReader datafile = new BufferedReader(new FileReader("/Users/data.arff"); 
Instances data = new Instances(datafile); 

//normalize 
final Normalize normalizeFilter = new Normalize(); 
normalizeFilter.setInputFormat(data); 
data = Filter.useFilter(data, normalizeFilter); 

//remove class column[0] from cluster 
data.setClassIndex(0); 
final Remove removeFilter = new Remove(); 
removeFilter.setAttributeIndices("" + (data.classIndex() + 1)); 
removeFilter.setInputFormat(data); 
data = Filter.useFilter(data, removeFilter); 

kmeans.buildClusterer(data); 

System.out.println(kmeans.toString()); 

// evaluate clusterer 
final ClusterEvaluation eval = new ClusterEvaluation(); 
eval.setClusterer(kmeans); 
eval.evaluateClusterer(data); 
System.out.println(eval.clusterResultsToString()); 

경우 CSV는 다음 파일을 아래에 언급 된 데이터 소스로 위의 BufferedReader 라인을 교체해야 :

final DataSource source = new DataSource("/Users/data.csv"); 
final Instances data = source.getDataSet();