gpt4 book ai didi

java - 在 Java lambda 中使用两个流来计算协方差

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:38 24 4
gpt4 key购买 nike

假设我有两个 double 组。我一直在尝试 Java 8 中的 Stream。我想我已经理解了主要思想但后来我意识到我不确定如何同时操作两个 Stream。

例如,我想计算两个数组的协方差。

public class foo {

public static double mean(double[] xs) {
return Arrays.stream(xs).average().getAsDouble();
}

public static void main(String[] args) {
double[] xs = {1, 2, 3, 4, 5, 6, 7, 8, 9};
double[] ys = {1517.93, 1757.78, 1981.1, 2215.73, 2942.66, 3558.32, 4063.91, 4521.16, 5101.76, 5234.12};

System.out.println("Mean of xs: " + mean(xs));
double xs_sumDeviation = Arrays.stream(xs)
.boxed()
.mapToDouble(d -> d.doubleValue() - mean(xs))
.sum();
// Covariance
double covXY = Arrays.stream(xs, ys)
.mapToDouble(x,y -> {
double numerator = (x-mean(xs)* (y-mean(ys);
double denominator = Math.sqrt((x-mean(xs)* (x-mean(xs));
return numerator / denominator;
})
.sum();

}
}

感谢您的建议。

尝试 1。

public static double covariance(double[] xs, double[] ys) {
double xmean = mean(xs);
double ymean = mean(ys);
double numerator = IntStream.range(0, Math.min(xs.length, ys.length))
.parallel()
.mapToDouble(i -> (xs[i] - xmean) * (ys[i] - ymean))
.sum();
double denominator = Math.sqrt(IntStream.range(0, xs.length)
.parallel()
.mapToDouble(i -> (xs[i] - xmean) * (xs[i] - xmean))
.sum());
return numerator / denominator;

最佳答案

在其他编程语言中,有某种zip函数,它接受多个可迭代,并返回一个迭代器,该迭代器聚合来自每个可迭代。例如,参见函数 zip在 Python 库中。

尽管可以在 Java 中实现类似的功能,但很难以支持高效并行执行的方式实现它。然而,Java 中有一个常用的模式,它有点不同。在您的情况下,它可能如下所示:

public static double covariance(double[] xs, double[] ys) {
double xmean = mean(xs);
double ymean = mean(ys);
return IntStream.range(0, Math.min(xs.length, ys.length))
.parallel()
.mapToDouble(i -> {
double numerator = (xs[i] - xmean) * (ys[i] - ymean);
double denominator = ...;
return numerator / denominator;
})
.sum();
}

您无需组合两个流,而是创建一个包含所有索引的 IntStream,并通过索引访问不同集合的元素。只要集合支持随机访问操作,这种方法就可以很好地工作。

关于java - 在 Java lambda 中使用两个流来计算协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24208890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com