gpt4 book ai didi

neo4j - 如何在带有集合的neo4j中使用平均函数

转载 作者:行者123 更新时间:2023-12-04 16:43:08 25 4
gpt4 key购买 nike

我想计算两个向量的协方差作为集合
A=[1, 2, 3, 4]
B=[5, 6, 7, 8]

Cov(A,B)= Sigma[(ai-AVGa)*(bi-AVGb)]/(n-1)

我的协方差计算问题是:

1)我不能有一个嵌套的聚合函数
当我写

SUM((ai-avg(a)) * (bi-avg(b)))

2)或者在另一种形状中,我怎样才能用一个reduce提取两个集合,例如:
REDUCE(x= 0.0, ai IN COLLECT(a) | bi IN COLLECT(b) | x + (ai-avg(a))*(bi-avg(b)))

3) 如果不可能在 oe 中提取两个集合,减少它们分离时如何关联它们的值来计算协方差
REDUCE(x= 0.0, ai IN COLLECT(a) | x + (ai-avg(a)))
REDUCE(y= 0.0, bi IN COLLECT(b) | y + (bi-avg(b)))

我的意思是我可以写嵌套的reduce吗?

4)有没有什么方法可以“放松”,“提取”

感谢您提供任何帮助。

最佳答案

Cyber​​sam 的回答完全没问题,但如果您想避免 n^2由双重 UNWIND 产生的笛卡尔积,您可以改为执行此操作:

WITH [1,2,3,4] AS a, [5,6,7,8] AS b
WITH REDUCE(s = 0.0, x IN a | s + x) / SIZE(a) AS e_a,
REDUCE(s = 0.0, x IN b | s + x) / SIZE(b) AS e_b,
SIZE(a) AS n, a, b
RETURN REDUCE(s = 0.0, i IN RANGE(0, n - 1) | s + ((a[i] - e_a) * (b[i] - e_b))) / (n - 1) AS cov;

编辑:

不叫任何人,但让我详细说明为什么您要避免 https://stackoverflow.com/a/34423783/2848578 中的双重 UNWIND| .就像我在下面所说的那样,在 Cypher 中展开 k 个长度为 n 的集合会导致 n^k行。因此,让我们采用两个长度为 3 的集合来计算协方差。
> WITH [1,2,3] AS a, [4,5,6] AS b
UNWIND a AS aa
UNWIND b AS bb
RETURN aa, bb;
| aa | bb
---+----+----
1 | 1 | 4
2 | 1 | 5
3 | 1 | 6
4 | 2 | 4
5 | 2 | 5
6 | 2 | 6
7 | 3 | 4
8 | 3 | 5
9 | 3 | 6

现在我们有 n^k = 3^2 = 9行。此时,取这些标识符的平均值意味着我们取 9 个值的平均值。
> WITH [1,2,3] AS a, [4,5,6] AS b
UNWIND a AS aa
UNWIND b AS bb
RETURN AVG(aa), AVG(bb);
| AVG(aa) | AVG(bb)
---+---------+---------
1 | 2.0 | 5.0

同样正如我在下面所说,这不会影响答案,因为重复数字向量的平均值将始终相同。例如,{1,2,3} 的平均值等于 {1,2,3,1,2,3} 的平均值。对于 n 的小值可能无关紧要,但是当您开始获得更大的 n 值时你会开始看到性能下降。

假设您有两个长度为 1000 的向量。用双 UNWIND 计算每个的平均值:
> WITH RANGE(0, 1000) AS a, RANGE(1000, 2000) AS b
UNWIND a AS aa
UNWIND b AS bb
RETURN AVG(aa), AVG(bb);
| AVG(aa) | AVG(bb)
---+---------+---------
1 | 500.0 | 1500.0

714 毫秒

明显比使用 REDUCE 慢:
> WITH RANGE(0, 1000) AS a, RANGE(1000, 2000) AS b
RETURN REDUCE(s = 0.0, x IN a | s + x) / SIZE(a) AS e_a,
REDUCE(s = 0.0, x IN b | s + x) / SIZE(b) AS e_b;
| e_a | e_b
---+-------+--------
1 | 500.0 | 1500.0

4 毫秒

为了将它们放在一起,我将在长度为 1000 的向量上完整比较两个查询:
> WITH RANGE(0, 1000) AS aa, RANGE(1000, 2000) AS bb
UNWIND aa AS a
UNWIND bb AS b
WITH aa, bb, SIZE(aa) AS n, AVG(a) AS avgA, AVG(b) AS avgB
RETURN REDUCE(s = 0, i IN RANGE(0,n-1)| s +((aa[i]-avgA)*(bb[i]-avgB)))/(n-1) AS
covariance;
| covariance
---+------------
1 | 83583.5

9105 毫秒
> WITH RANGE(0, 1000) AS a, RANGE(1000, 2000) AS b
WITH REDUCE(s = 0.0, x IN a | s + x) / SIZE(a) AS e_a,
REDUCE(s = 0.0, x IN b | s + x) / SIZE(b) AS e_b,
SIZE(a) AS n, a, b
RETURN REDUCE(s = 0.0, i IN RANGE(0, n - 1) | s + ((a[i] - e_a) * (b[i
] - e_b))) / (n - 1) AS cov;
| cov
---+---------
1 | 83583.5

33 毫秒

关于neo4j - 如何在带有集合的neo4j中使用平均函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422801/

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