2010-02-16 63 views
6

Tôi có một tệp ARFF chứa 14 cột số. Tôi muốn thực hiện bình thường hóa trên từng cột riêng biệt, điều đó đang sửa đổi các giá trị từ mỗi cột thành (actual_value - min(this_column))/(max(this_column) - min(this_column)). Do đó, tất cả các giá trị từ một cột sẽ nằm trong phạm vi [0, 1]. Giá trị nhỏ nhất và tối đa từ một cột có thể khác với giá trị của một cột khác.Weka chuẩn hóa các cột

Làm cách nào tôi có thể thực hiện việc này với bộ lọc Weka?

Cảm ơn

Trả lời

8

Điều này có thể được thực hiện bằng

weka.filters.unsupervised.attribute.Normalize 

Sau khi áp dụng bộ lọc này tất cả các giá trị trong mỗi cột sẽ nằm trong khoảng [0, 1]

+0

có thể chỉ tôi ra file arff bình thường sau khi tôi đã bình thường hóa nó và trước khi chạy phân loại? (Tôi muốn lưu nó trên đĩa) – aneuryzm

1

Đúng vậy. Chỉ muốn nhắc nhở về sự khác biệt của "bình thường hóa" và "tiêu chuẩn hóa". Những gì được đề cập trong câu hỏi là "tiêu chuẩn hóa", trong khi "bình thường hóa" giả định phân bố Gaussian và bình thường hóa theo trung bình, và biến thể chuẩn của mỗi thuộc tính. Nếu bạn có một ngoại lệ trong dữ liệu của bạn, bộ lọc tiêu chuẩn hóa có thể làm tổn thương việc phân phối dữ liệu của bạn là min hoặc max có thể cao hơn nhiều so với các trường hợp khác.

+1

Không, câu hỏi có đúng, bạn mô tả nó chính xác cách sai: http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry

0

Đây là ví dụ bình thường hóa làm việc với K-Means trong JAVA.

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()); 

Nếu bạn có tập tin CSV sau đó thay thế dòng BufferedReader trên với dưới đây đề cập Datasource:

final DataSource source = new DataSource("/Users/data.csv"); 
final Instances data = source.getDataSet(); 
Các vấn đề liên quan