为什么要用离散数据求均值?很多时候使用平均数,把大量数据累加起来再除以数据的个数并不能真实的反应数据的情况,比如一组稳定80左右的数据,因为其中有几个20的数据,导致求到的平均值就会和真实的情况相差一些。而离散数据的均值是求出的数据的平均状况,数据值得平均水平。这个均值也称为数学期望。
废话不多说,直接上代码
private static BigDecimal GetDataEx() {
List<BigDecimal> list=new ArrayList<>();
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(25));
list.add(new BigDecimal(10));
list.add(new BigDecimal(100));
// 计算每个性能数据出现的次数
Map<BigDecimal, Integer> map = new HashMap<BigDecimal, Integer>();
if (list != null && list.size() > 0) {
for (BigDecimal temp : list) {
Integer count = map.get(temp);
map.put(temp, (count == null) ? 1 : count + 1);
}
System.out.println(map);
}
// 根据离散数学去计算数学期望值,即均值
BigDecimal ex=BigDecimal.ZERO;
for (Map.Entry<BigDecimal, Integer> entry : map.entrySet()) {
// (测试)数学期望均值 25x0.9+10x0.05+100x0.05=28
// 性能数据的值
BigDecimal keyVal=entry.getKey();
// 这个数据出现的次数
Integer valueVal=entry.getValue();
// 计算改数据的权重
Integer total=list.size();
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setMaximumFractionDigits(4);
String val=numberFormat.format((float) valueVal/(float) total);
BigDecimal exMap= keyVal.multiply(new BigDecimal(val));
// 加权求期望
ex=ex.add(exMap);
}
return ex;
}