문제

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

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

감사

도움이 되었습니까?

해결책

이것은 사용을 수행 할 수 있습니다

weka.filters.unsupervised.attribute.Normalize

이 필터를 적용한 후 각 열의 모든 값은 범위 [0, 1]입니다.

다른 팁

좋아요. "정규화"와 "표준화"의 차이점을 상기시키고 싶었습니다. 질문에서 언급 된 것은 "표준화"이며 "정규화"는 가우시안 분포를 가정하고 평균 및 각 속성의 표준 변동으로 정규화됩니다. 데이터에 이상치가있는 경우 표준화 필터가 최소가 있으므로 데이터 분포가 손상 될 수 있거나 Max가 다른 인스턴스보다 훨씬 멀어 질 수 있습니다.

다음은 Java의 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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top