将高斯转换为直方图
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),忽略你想要的范围之外的点。
我是 运行 一个粒子模型,我想要模拟高斯分布的粒子位置的初始条件。
如果我在一维网格上有 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),忽略你想要的范围之外的点。