Дисперсия и ковариация двумерного нормального распределения

#python #statistics #covariance #normal-distribution #variance

Вопрос:

Итак, недавно я задал аналогичный вопрос, и он касался определения дисперсии нормального распределения с одной переменной.

В этом случае с заданными (x,y) мы могли бы найти среднее значение ( mn ) и дисперсию ( sgm ), используя:

 mn = np.average(x, weights=y)
sgm = np.average((abs(x-mn))**2, weights=y)
 

Однако я не могу найти способ заставить то же самое работать для двумерного нормального распределения:

 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 (с использованием максимальных значений дает тот же результат) и вычисления их среднего значения(Мн) и разницы(ВР), и он дает правильные результаты для дисперсии (там vr_x должны быть равны sigma_x**2 ) и для среднего (mn_x равна mu_x), однако результат для ковариации является некорректной, поскольку в Формуле я f(x,y) ковариация( cov ) должно быть равно 0

Вопросы заключаются в следующем: является ли это правильным способом вычисления дисперсии? Если да, то почему значение ковариации неверно?

Комментарии:

1. Самый простой способ вычислить дисперсию выборки в нескольких измерениях — просто использовать базовое тождество, Var(X) = E(транспонировать(X) . X) — транспонировать(среднее(X)) . среднее(X), где «.» = умножение матрицы, стараясь различать строки и столбцы. Может быть, вы можете попробовать это в Octave или Matlab, убедиться, что вы можете заставить его работать, а затем поработать над переводом на Python. Матричное умножение, вероятно, реализовано в Numpy, хотя я не знаю синтаксиса, не посмотрев его.