关联2D矢量场

时间:2018-11-09 16:13:58

标签: numpy scikit-learn scipy correlation covariance

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

问题

一个人不应该(?)调整2个形状为(x,y,2)的流图的大小:flow1, flow2到一维矢量并运行

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

因为x,y条目已连接。

绘制收益,仅用于可视化目的

流1: flow1 流程2: flow2

我正在考虑比较幅度和方向

  • 理想情况下,如何比较这些值(cosinus距离,...)?

  • 一个如何比较矢量场之间的协方差?

编辑:

我知道np.corrcoef(flow1.reshape(2,-1), flow2.reshape(2,-1))会返回一个4,4相关系数矩阵,但难以理解。

1 个答案:

答案 0 :(得分:2)

对于某些相似性度量,确实可能需要考虑域的空间结构。但是相关系数不能做到这一点:在域的任何排列下它都是不变的。例如,(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))

在这里,由于我将flow2包括在flow1中,所以流量具有一些正相关。具体来说,它是1/sqrt(2)附近的数字,容易受到随机噪声的影响。

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