Python 二元正态分布的方差和协方差

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

所以,我最近问了一个类似的问题,关于寻找单变量正态分布的方差

在这种情况下,对于给定的(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 * 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))