#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, хотя я не знаю синтаксиса, не посмотрев его.