使用Java Weka统计离散属性age各取值的出现次数
统计Weka中age属性各取值的出现次数
要搞定Weka数据集里age属性每个预设取值的出现次数(包括那些一次都没出现的取值),用Java API来实现是最直接可控的方式,下面给你具体的代码示例和说明:
实现思路
- 先拿到
age属性预先定义的所有取值(就是你指定的{10-19,20-29,...,90-99}) - 初始化统计容器,把所有预设取值的次数先设为0,避免漏掉没出现的取值
- 遍历整个数据集,逐个统计每个取值的实际出现次数
- 最后按要求格式输出所有结果
代码示例
import weka.core.Attribute; import weka.core.Instances; import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.Map; public class AgeValueCounter { public static void main(String[] args) throws Exception { // 替换成你的数据集文件路径 BufferedReader reader = new BufferedReader(new FileReader("your_dataset.arff")); Instances data = new Instances(reader); reader.close(); // 获取age属性对象 Attribute ageAttribute = data.attribute("age"); if (ageAttribute == null) { System.out.println("数据集里找不到age属性,请检查属性名是否正确"); return; } // 初始化统计Map,确保所有预设取值都被纳入 Map<String, Integer> ageCountMap = new HashMap<>(); for (int i = 0; i < ageAttribute.numValues(); i++) { String value = ageAttribute.value(i); ageCountMap.put(value, 0); } // 遍历数据集统计次数 for (int i = 0; i < data.numInstances(); i++) { // 跳过age属性值缺失的实例 if (!data.instance(i).isMissing(ageAttribute)) { String currentAge = data.instance(i).stringValue(ageAttribute); ageCountMap.put(currentAge, ageCountMap.get(currentAge) + 1); } } // 输出最终统计结果 System.out.println("age属性各取值出现次数统计:"); for (String ageRange : ageCountMap.keySet()) { System.out.printf("age %s: %d%n", ageRange, ageCountMap.get(ageRange)); } } }
代码说明
- 记得把代码里的
your_dataset.arff替换成你实际的数据集文件路径 - 初始化Map时先把所有预设取值设为0,保证哪怕某个区间没有数据,也会输出
0的结果 - 遍历数据集时跳过了age值缺失的实例,避免统计出错
- 最终输出的格式完全符合你要的样式,比如
age 10-19: 50这种形式
要是你想用Weka命令行工具的话,虽然也能实现,但步骤繁琐且不好控制输出格式,上面的API方法是最省心的选择。
内容的提问来源于stack exchange,提问作者sheldonzy
相关产品推荐
相关产品推荐

