首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >计算一维数组之间的协方差,以便合并到Python中的不确定性传播中

计算一维数组之间的协方差,以便合并到Python中的不确定性传播中
EN

Stack Overflow用户
提问于 2018-07-10 06:19:16
回答 1查看 473关注 0票数 0

我有四个一维的因变量数组。它们包含数百个数据点,但在本例中我将它们裁剪为20个数据点。每个点代表地图上的一个网格单元。

import numpy as np

A=np.asarray([0.195, 0.154, 0.208, 0.22, 0.204, 0.175, 0.184, 0.187, 0.171, 0.2, 0.222, 0.235, 0.206, 0.215, 0.222, 0.252, 0.269, 0.251, 0.285, 0.28])
B=np.asarray([0.119, 0.134, 0.132, 0.121, 0.11, 0.097, 0.13, 0.106, 0.103, 0.139, 0.124, 0.147, 0.152, 0.123, 0.177, 0.172, 0.18, 0.182, 0.197, 0.193])
C=np.asarray([0.11, 0.1, 0.103, 0.111, 0.105, 0.098, 0.099, 0.093, 0.105, 0.099, 0.113, 0.093, 0.104, 0.095, 0.099, 0.105, 0.108, 0.128, 0.125, 0.118])
D=np.asarray([-0.015, -0.015, -0.007, -0.02, 0.002, 0.009, 0.019, 0.0, -0.02, -0.001, -0.006, -0.015, -0.03, -0.036, -0.051, -0.058, -0.065, -0.081, -0.082, -0.055])

每个变量的错误都包含在数组中:

A_err=np.asarray([ 0.016,  0.015,  0.017,  0.016,  0.015,  0.016,  0.016,  0.018, 0.015,  0.014,  0.015,  0.016,  0.017,  0.016,  0.017,  0.017, 0.017,  0.017,  0.017,  0.017])
B_err=np.asarray([ 0.045,  0.049,  0.039,  0.044,  0.036,  0.027,  0.032,  0.033, 0.029,  0.036,  0.032,  0.027,  0.04 ,  0.022,  0.034,  0.026, 0.021,  0.028,  0.035,  0.028])
C_err=np.zeros(20)+0.7
D_err=np.zeros(20)+0.9

Y是A、B、C和D的和:

Y=A+B+C+D

显然,Y在20个网格单元格中的每个单元格中都有不同的值。我试图计算的是每一次Y测量的误差。最初,我的计算方法很简单:

Y_err=np.sqrt(A_err**2 + B_err**2 + C_err**2 + D_err**2)

但这不包括协方差项。由于我没有变量A、B、C和D彼此之间的表达式,因此我看到的计算协方差的唯一方法是使用相关协方差矩阵:

X = np.vstack([A,B,C,D])
C = np.cov(X)
print(C)
[[  1.31819737e-03   9.52921053e-04   2.17881579e-04  -8.58197368e-04]
[  9.52921053e-04   9.87252632e-04   1.69478947e-04  -7.97089474e-04]
[  2.17881579e-04   1.69478947e-04   9.47868421e-05  -1.88007895e-04]
[ -8.58197368e-04  -7.97089474e-04  -1.88007895e-04   8.85081579e-04]]

我不清楚是否可以简单地将六个非对角矩阵项分别相加:

σ_AB=9.52921053e-04 
σ_AC=2.17881579e-04
σ_AD=-8.58197368e-04
σ_BC=1.69478947e-04
σ_BD=-7.97089474e-04
σ_CD=-1.88007895e-04 

转换成误差传播的方程,这样:

Y_err=np.sqrt(A_err**2 + B_err**2 + C_err**2 + D_err**2 + 2*σ_AB + 2*σ_AC + 2*σ_AD + 2*σ_BC + 2*σ_BD + 2*σ_CD)

或者这是完全无效的?

EN

回答 1

Stack Overflow用户

发布于 2018-07-10 07:06:18

这就是我对你的测量的理解:如果你有一个单一网格的多个测量。然后,您将从这些观察值中计算出测量中的std误差,包括交叉项。在这里,每个网格都有一个单一的测量值以及与该测量值相关的误差。由于您使用相同的过程对所有20个网格进行了测量,因此您可以做的是计算测量过程的std_err,并将相同的不确定性添加到所有20个观测值中。

用于建模误差测量中的不确定性(仅限误差项),即Y_err中的标准误差。协方差/交叉项让您了解测量中的不确定性/误差是如何相互关联的(即σ_A_err_B_err),而不是实际测量变量之间的关系(即σ_AB)。

而不是:X = np.vstack([A,B,C,D])

您需要:X = np.vstack([A_err,B_err,C_err,D_err])来计算误差项中的协方差。

你的公式应该是:包含在协方差矩阵中的所有元素(包括对角线项):np.cov(np.vstack([A_err,B_err,C_err,D_err]))

Y_std_err= np.sqrt(σ_A_err**2 + σ_B_err**2 + σ_C_err**2 + σ_D_err**2 + 
                   2*σ_A_err_B_error + 2*σ_A_err_C_err + 2*σ_A_err_D_err + 
                   2*σ_B_err_C_err + 2*σ_B_err_D_err + 2*σ_C_err_D_err)

此外,您还可以直接将矩阵相乘,以获得y的样本方差,而不是求和公式。

其中S是误差项的样本方差/协方差矩阵,c是测量模型的线性组合系数。

X = np.vstack([A_err,B_err,C_err,D_err])        # matrix of error terms
cov = np.cov(X)
c = np.asarray([1, 1, 1, 1])                    # coefficients: linear combination 
var_y_err = np.matmul(c.T, np.matmul(cov,c))

np.sqrt(var_y_err)                              # standard error in measurement of Y: stdy_y_err
# 0.007379024325749306

Y值应该是A、B、C、D的简单和,并且每个阵列点具有高于(+或-)平均值的Y_error (取决于误差方向),并且具有其自己的标准误差(+/-)。

Y = A + B + C + D  (+ or -) Y_err_avg     # Y_err will be an interval for every grid:
Y_err_avg = sum(A_err + B_err + C_err + D_err)/ 20 + (+/-) std_y_err

PS:我不是错误传播方面的专家。我建议你在交叉验证上发布你的问题,以获得专家的意见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51254777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档