def gaussian_sum(self, centers, weights, settings):
"""Calculates a discrete version of a sum of Gaussian distributions.
The calculation is done through the cumulative distribution function
that is better at keeping the integral of the probability function
constant with coarser grids.
The values are normalized by dividing with the maximum value of a
gaussian with the given standard deviation.
Args:
centers (1D np.ndarray): The means of the gaussians.
weights (1D np.ndarray): The weights for the gaussians.
settings (dict): The grid settings
Returns:
Value of the gaussian sums on the given grid.
"""
start = settings["min"]
stop = settings["max"]
sigma = settings["sigma"]
n = settings["n"]
max_val = 1/(sigma*math.sqrt(2*math.pi))
dx = (stop - start)/(n-1)
x = np.linspace(start-dx/2, stop+dx/2, n+1)
pos = x[np.newaxis, :] - centers[:, np.newaxis]
y = weights[:, np.newaxis]*1/2*(1 + erf(pos/(sigma*np.sqrt(2))))
f = np.sum(y, axis=0)
f /= max_val
f_rolled = np.roll(f, -1)
pdf = (f_rolled - f)[0:-1]/dx # PDF is the derivative of CDF
return pdf
评论列表
文章目录