首页 > 解决方案 > 相关 2D 矢量场

问题描述

拥有多个 2D 流图,即向量场,如何找到这些对之间的统计相关性?

问题:_

不应该(?)将 2 个形状为 (x,y,2): 的流图调整flow1, flow2为 1D 向量并运行

np.correlation_coeff(flow1.reshape(1,-1),flow2.reshape(1,-1))

因为 x,y 条目是连接的。

绘制产量,仅用于可视化目的:

流1: 流2:流1 流2

我正在考虑比较大小和方向

编辑:

我知道这np.corrcoef(flow1.reshape(2,-1), flow2.reshape(2,-1))将返回一个 4,4 相关系数矩阵,但发现它解释起来不直观。

标签: numpyscikit-learnscipycorrelationcovariance

解决方案


对于某些相似性度量,可能确实需要考虑域的空间结构。但是相关系数并不能做到这一点:它在域的任何排列下都是不变的。例如,(0, 1, 2, 3, 4) 和 (1, 2, 4, 8, 16) 之间的相关性与 (1, 4, 2, 0, 3) 和 (2, 16) 之间的相关性相同, 4, 1, 8) 其中两个数组都以相同的方式重新洗牌。

因此,相关系数将通过以下方式获得:

  1. 将两个数组居中,即减去它们的平均值。比如说,我们得到 FC1 和 FC2。
  2. 取内积 FC1 和 FC2 :这只是匹配项的乘积之和。
  3. 除以内积 FC1*FC1 和 FC2*FC2 的平方根。

例子:

flow1 = np.random.uniform(size=(10, 10, 2))     # the 3rd dimension is for the components
flow2 = flow1 + np.random.uniform(size=(10, 10, 2))
flow1_centered = flow1 - np.mean(flow1, axis=(0, 1))
flow2_centered = flow2 - np.mean(flow2, axis=(0, 1))
inner_product = np.sum(flow1_centered*flow2_centered)
r = inner_product/np.sqrt(np.sum(flow1_centered**2) * np.sum(flow2_centered**2))

这里的流量有一些正相关,因为我在 flow1 中包含了 flow2。具体来说,它是一个 周围的数字1/sqrt(2),受随机噪声影响。

如果这不是您想要的,那么您不需要相关系数,而是需要其他一些相似性度量。


推荐阅读