将高斯转换为直方图

Converting gaussian to histogram

我是 运行 一个粒子模型,我想要模拟高斯分布的粒子位置的初始条件。 如果我在一维网格上有 N 个从 -10 到 10 的粒子,我希望它们根据具有已知均值和标准差的高斯分布在网格上。它基本上是创建一个直方图,其中每个 bin 宽度为 1(位置分辨率的 x 轴为 1),每个 bin 的频率应该是其中有多少粒子,它们加起来应该是 N

我的策略是在x轴网格上绘制一个高斯函数,然后对每个点的粒子数进行近似值:

def gaussian(x, mu, sig):
    return 1./(np.sqrt(2.*np.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)

mean = 0
sigma = 1

x_values = np.arange(-10, 10, 1)
y = gaussian(x_values, mean, sigma)

然而,我有归一化问题(总和不等于 N),每个点的粒子数应该是一个整数(我考虑过将 y数组到整数,但同样,由于归一化问题,我得到一条扁平线)。

通常,问题是将高斯拟合到直方图,但在我的情况下,我需要做相反的事情——我还找不到解决方案。我将不胜感激任何帮助! 谢谢!!!

您可以使用 numpy.random.normal 对该分布进行采样。您可以使用以下代码在遵循高斯分布的 (-10, 10) 范围内获得 N 点。

import numpy as np
import matplotlib.pyplot as plt

N = 10000
mean = 5
sigma = 3

bin_edges = np.arange(-10, 11, 1)
x_values = (bin_edges[1:] + bin_edges[:-1]) / 2


points = np.random.normal(mean, sigma, N * 10)
mask = np.logical_and(points < 10, points > -10)
points = points[mask]  # drop points outside range
points = points[:N]  # only use the first N points
y, _ = np.histogram(points, bins=bin_edges)


plt.scatter(x_values, y)
plt.show()

思路是生成大量的随机数(代码中为10 N),忽略你想要的范围之外的点。