Python 二元正态分布的方差和协方差
所以,我最近问了一个类似的问题,关于寻找单变量正态分布的方差 在这种情况下,对于给定的(x,y),我们可以使用以下方法找到均值(Python 二元正态分布的方差和协方差,python,statistics,covariance,normal-distribution,variance,Python,Statistics,Covariance,Normal Distribution,Variance,所以,我最近问了一个类似的问题,关于寻找单变量正态分布的方差 在这种情况下,对于给定的(x,y),我们可以使用以下方法找到均值(mn)和方差(sgm): 然而,我找不到一种方法使同样的事情适用于二元正态分布: import numpy as np from matplotlib import pyplot as plt N = 50 mu_x = 25 mu_y = 25 sigma_x = 5 sigma_y = 5 def f(x,y): otv = 1/(sigma_x * s
mn
)和方差(sgm
):
然而,我找不到一种方法使同样的事情适用于二元正态分布:
import numpy as np
from matplotlib import pyplot as plt
N = 50
mu_x = 25
mu_y = 25
sigma_x = 5
sigma_y = 5
def f(x,y):
otv = 1/(sigma_x * sigma_y * np.sqrt(2 * np.pi)) * np.exp( (- (x - mu_x)**2 / (2 * sigma_x**2)) - (y - mu_y)**2 / (2 * sigma_y**2))
return otv
x = np.arange(N)
y = np.arange(N)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
menx = np.mean(Z,0)
meny = np.mean(Z,1)
mn_x = np.average(x, weights=menx)
mn_y = np.average(x, weights=meny)
vr_x = np.average((abs(x-mn_x))**2, weights=menx)
vr_y = np.average((abs(x-mn_y))**2, weights=meny)
a = x - mn_x
b = y - mn_y
c = a*b
cov = np.sum(c)/(Nx*Nx - 1)
vr = vr_x + vr_y + 2*cov
print(mn_x)
print(mn_y)
print(np.sqrt(vr))
说明:我尝试使用x和y的平均值(使用最大值得到相同的结果)将图形投影到轴上,并计算它们的平均值(mn)和方差(vr),它给出了正确的方差结果(那里vr_x
应该等于sigma_x**2
)和平均值(mn_x等于mu_x),然而,协方差的结果是不正确的,因为在公式I中使用了f(x,y)
协方差(cov
)应该是0
问题是:
这是计算方差的正确方法吗?
如果是这样,为什么协方差的值不正确?计算多维样本方差的最简单方法是只使用基本恒等式Var(X)=E(转置(X).X)-转置(平均值(X))。均值(X),其中“.”=矩阵乘法,注意保持行和列的不同。也许您可以在Octave或Matlab中尝试,验证它是否可以工作,然后将其转换为Python。矩阵乘法可能是在Numpy中实现的,尽管我不查它就不知道语法。
import numpy as np
from matplotlib import pyplot as plt
N = 50
mu_x = 25
mu_y = 25
sigma_x = 5
sigma_y = 5
def f(x,y):
otv = 1/(sigma_x * sigma_y * np.sqrt(2 * np.pi)) * np.exp( (- (x - mu_x)**2 / (2 * sigma_x**2)) - (y - mu_y)**2 / (2 * sigma_y**2))
return otv
x = np.arange(N)
y = np.arange(N)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
menx = np.mean(Z,0)
meny = np.mean(Z,1)
mn_x = np.average(x, weights=menx)
mn_y = np.average(x, weights=meny)
vr_x = np.average((abs(x-mn_x))**2, weights=menx)
vr_y = np.average((abs(x-mn_y))**2, weights=meny)
a = x - mn_x
b = y - mn_y
c = a*b
cov = np.sum(c)/(Nx*Nx - 1)
vr = vr_x + vr_y + 2*cov
print(mn_x)
print(mn_y)
print(np.sqrt(vr))