java 标准偏差_Java Streams-标准偏差

小编典典

您可以将自定义收集器用于此任务,以计算平方和。内置DoubleSummaryStatistics收集器不跟踪它。专家组在此主题中对此进行了讨论,但最终未实现。计算平方和的困难在于对中间结果求平方时可能发生溢出。

static class DoubleStatistics extends DoubleSummaryStatistics {

private double sumOfSquare = 0.0d;

private double sumOfSquareCompensation; // Low order bits of sum

private double simpleSumOfSquare; // Used to compute right sum for non-finite inputs

@Override

public void accept(double value) {

super.accept(value);

double squareValue = value * value;

simpleSumOfSquare += squareValue;

sumOfSquareWithCompensation(squareValue);

}

public DoubleStatistics combine(DoubleStatistics other) {

super.combine(other);

simpleSumOfSquare += other.simpleSumOfSquare;

sumOfSquareWithCompensation(other.sumOfSquare);

sumOfSquareWithCompensation(other.sumOfSquareCompensation);

return this;

}

private void sumOfSquareWithCompensation(double value) {

double tmp = value - sumOfSquareCompensation;

double velvel = sumOfSquare + tmp; // Little wolf of rounding error

sumOfSquareCompensation = (velvel - sumOfSquare) - tmp;

sumOfSquare = velvel;

}

public double getSumOfSquare() {

double tmp = sumOfSquare + sumOfSquareCompensation;

if (Double.isNaN(tmp) && Double.isInfinite(simpleSumOfSquare)) {

return simpleSumOfSquare;

}

return tmp;

}

public final double getStandardDeviation() {

return getCount() > 0 ? Math.sqrt((getSumOfSquare() / getCount()) - Math.pow(getAverage(), 2)) : 0.0d;

}

}

然后,您可以将此类用于

Map standardDeviationMap =

list.stream()

.collect(Collectors.groupingBy(

e -> e.getCar(),

Collectors.mapping(

e -> e.getHigh() - e.getLow(),

Collector.of(

DoubleStatistics::new,

DoubleStatistics::accept,

DoubleStatistics::combine,

d -> d.getStandardDeviation()

)

)

));

这会将输入列表收集到一个映射中,该映射中的值对应于high - low同一键的标准偏差。

2020-11-13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值