2010-02-16 101 views
6

我有一个包含14个数字列的ARFF文件。我想单独对每列执行标准化,即将每个柱的值修改为(actual_value - min(this_column))/(max(this_column) - min(this_column))。因此,列中的所有值都将在[0, 1]的范围内。列中的最小值和最大值可能与另一列中的最小值和最大值不同。Weka标准化列

我怎样才能用Weka滤镜做到这一点?

由于

回答

8

这可以使用

weka.filters.unsupervised.attribute.Normalize 

在每列中应用该过滤器的所有值后,将在范围[0,1]

+0

可以只I输出标准化的ARFF文件后,我已经标准化,并之前运行的分类? (我想将它保存在磁盘上) – aneuryzm 2011-05-02 12:29:29

1

这是正确的进行。只是想提醒一下“正常化”和“标准化”的区别。问题中提到的是“标准化”,而“标准化”则假定高斯分布并通过均值标准化,并标准化每个属性的变化。如果您的数据中存在异常值,则标准化过滤器可能会损害您的数据分布,因为最小值或最大值可能比其他实例远得多。

+1

不,这个问题是对的,你完全用错误的方式描述它:http://www.dataminingblog.com/standardization-vs-normalization/ – Sentry 2014-01-22 16:30:17

0

下面是在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文件,然后用以下提到的DataSource来替换上面的BufferedReader行:

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