我有一个包含14个数字列的ARFF文件。我想分别对每个列执行规范化,即将每个列的值修改为(actual_value - min(this_column)) / (max(this_column) - min(this_column)
)。因此,列中的所有值都将在[0, 1]
范围内。列的最小值和最大值可能与另一列的最小值和最大值不同。
如何使用Weka过滤器执行此操作?
由于
答案 0 :(得分:8)
这可以使用
完成weka.filters.unsupervised.attribute.Normalize
应用此过滤器后,每列中的所有值都将在[0,1]
范围内答案 1 :(得分:1)
没错。只是想提醒一下“规范化”和“标准化”的区别。问题中提到的是“标准化”,而“标准化”假定高斯分布并按均值归一化,并且每个属性的标准变化。如果数据中有异常值,则标准化过滤器可能会损害您的数据分布,因为min或max可能比其他实例远得多。
答案 2 :(得分: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文件,那么用上面提到的数据源替换上面的BufferedReader行:
final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();
答案 3 :(得分:0)
在这种情况下,我们可以使用 weka.filters.unsupervised.attribute.Normalize
过滤器进行规范化,但如果我们只想规范化某些列,以下将是最佳方法。
对选定的列应用标准化
unsupervised.attribute.PartitionedMultiFilter
可用于此任务。
因此,您必须根据需要配置 filters 和 ranges 部分。
例如:如果我只想对湿度属性进行标准化
第 1 步:
添加 ParririonedMultiFilter 后 -> 点击过滤器文本框 -> 从 weka.filters.unsupervised.attribute.Normalize
中选择 Normalize -> 并根据需要编辑 Normalize 过滤器(通过提供比例和平移值)
第 2 步:
点击范围文本框 -> 删除默认过滤器(首尾) -> 然后添加要过滤的列号 -> 单击确定 -> 单击应用
现在过滤器将只添加到选定的(湿度)列。