python:2D分布的整合一阶矩

时间:2016-09-09 04:08:51

标签: python arrays numpy statistics numerical-integration

我有一个(标准化的)2D数据数组 - 假设自变量是x和theta,数据是Data。 (数据实际上是一个后验分布,但只是存储为一个numpy数组。)我需要在每个维度上取一阶矩,即我需要计算双积分

enter image description here

我以为我可以实现这个,例如对于:

firstint = np.trapz(x*Data, dx=dx, axis=1)
a = np.trapz(firstint, dx=dy)

其中dx = x[1] - x[0]dy=y[1] - y[0](x和y都是均匀间隔数据的1d数组)。

但这似乎不起作用 - 例如当我用2D高斯测试它时,我希望得到(x,y)高斯值达到峰值的值,但我没有。

有人能指出我正确的方向吗?我做错了什么?

编辑:这是一个MWE,输出如下。请注意,其中一个尺寸(b积分)工作正常。当我设置xmeas = 0.5时,a积分仅给出预期的答案。我是不是没有正确地正常化,或者出于其他原因期待错误的答案?

from __future__ import division, print_function
import numpy as np

sample_x = np.linspace(0, 1, 100)
sample_y = np.linspace(0, np.pi, 100)

y_dx = sample_y[1] - sample_y[0]
x_dx = sample_x[1] - sample_x[0]

yarr = sample_y[:, np.newaxis]
xarr = sample_x

# pick some values
ymeas = np.pi/6
xmeas = 0.1

fwhm = 0.3

# construct 2D gaussian
gaussian = np.exp(-4*np.log(2) * ((xarr-xmeas)**2 + (yarr-ymeas)**2) / fwhm**2)

integrated_over_y = np.trapz(gaussian, dx = y_dx, axis = 1)
integrated_over_x_and_y = np.trapz(integrated_over_y, dx = x_dx)

normed_gaussian = gaussian/integrated_over_x_and_y

# y moment
aintegrand = np.trapz(normed_gaussian*sample_x, axis=1, dx=x_dx)
a = np.trapz(aintegrand, dx=y_dx)

print("expected {}, got {}".format(xmeas, a))

# x moment
bintegrand = np.trapz(normed_gaussian*sample_y[:, np.newaxis], axis=1, dx=x_dx)
b = np.trapz(bintegrand, dx=y_dx)

print("expected {}, got {}".format(ymeas, b))

输出:

>> a: expected 0.1, got 0.147652018282
>> b: expected 0.523598775598, got 0.523610579349

0 个答案:

没有答案