【发布时间】:2016-04-15 11:55:58
【问题描述】:
我使用此处给出的等式在 Python 中构建了一个包裹的二元高斯分布: http://www.aos.wisc.edu/~dvimont/aos575/Handouts/bivariate_notes.pdf 但是,我不明白为什么我的分布尽管包含了一个归一化常数,但总和却不能为 1。
对于 U x U 晶格,
import numpy as np
from math import *
U = 60
m = np.arange(U)
i = m.reshape(U,1)
j = m.reshape(1,U)
sigma = 0.1
ii = np.minimum(i, U-i)
jj = np.minimum(j, U-j)
norm_constant = 1/(2*pi*sigma**2)
xmu = (ii-0)/sigma; ymu = (jj-0)/sigma
rhs = np.exp(-.5 * (xmu**2 + ymu**2))
ker = norm_constant * rhs
>> ker.sum() # area of each grid is 1
15.915494309189533
我确信我的思考方式从根本上缺失,并怀疑需要进行某种额外的规范化,尽管我无法绕过它。
更新:
感谢其他人有见地的建议,我重写了我的代码以将 L1 规范化应用于内核。但是,似乎在通过 FFt 进行 2D 卷积的情况下,将范围保持为 [0, U] 仍然能够返回令人信服的结果:
U = 100
Ukern = np.copy(U)
#Ukern = 15
m = np.arange(U)
i = m.reshape(U,1)
j = m.reshape(1,U)
sigma = 2.
ii = np.minimum(i, Ukern-i)
jj = np.minimum(j, Ukern-j)
xmu = (ii-0)/sigma; ymu = (jj-0)/sigma
ker = np.exp(-.5 * (xmu**2 + ymu**2))
ker /= np.abs(ker).sum()
''' Point Density '''
ido = np.random.randint(U, size=(10,2)).astype(np.int)
og = np.zeros((U,U))
np.add.at(og, (ido[:,0], ido[:,1]), 1)
''' Convolution via FFT and inverse-FFT '''
v1 = np.fft.fft2(ker)
v2 = np.fft.fft2(og)
v0 = np.fft.ifft2(v2*v1)
dd = np.abs(v0)
plt.plot(ido[:,1], ido[:,0], 'ko', alpha=.3)
plt.imshow(dd, origin='origin')
plt.show()
【问题讨论】:
-
我不完全明白您为什么需要
np.minimum(i, U-i)。你想在那里实现什么目标? -
另外,你能在这里定义一下“包装”是什么意思吗?
-
@Praveen imaluengo 在怀疑我正在尝试构建一个高斯核时是正确的——它代表了个体的运动范围,我将它与离散的人口分布进行卷积以估计人口密度表面。 minimum 函数将内核的峰值设置在原点,内核值随着到原点的距离而减小。因此,“包裹”意味着内核“包裹”在 UxU 晶格边缘周围,从而产生四个角的半圆图。
标签: python numpy distribution gaussian probability-density