Я построил обернутое двумерное гауссовское распределение в Python, используя приведенное здесь уравнение: http://www.aos.wisc.edu/~dvimont/aos575/Handouts/bivariate_notes.pdf Однако я не понимаю, почему мое распределение не суммируется до 1, несмотря на включение константы нормализации.2D gaussian distribution не суммируется с одним?
Для U х 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
Я уверен, там принципиально отсутствует в пути, я думал об этом, и подозреваю, что какое-то дополнительная нормализация необходимо, хотя я не могу причина моего пути вокруг него.
UPDATE:
Благодаря содержательные предложения других, я переписал код для применения L1 нормализации ядра. Тем не менее, представляется, что в контексте 2D свертка с помощью FFT, сохраняя диапазон как [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
Кроме того, вы могли бы определить, что вы подразумеваете под «обертыванием» здесь? – Praveen
@ Praveen imaluengo был прав, когда подозревал, что я пытаюсь построить гауссово ядро - он представляет собой индивидуальный диапазон движений, и я сверлю его с дискретным распределением популяции, чтобы получить оценку плотности плотности населения. Минимальная функция устанавливает пик ядра в начале координат, а значение ядра уменьшается с расстоянием до начала координат. Следовательно, «обертывание» подразумевает, что ядро «обертывается» вокруг решеток ребер UxU, в результате получается график с полукруглом в четырех углах. –