[英]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)
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),並忽略您所需范圍之外的點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.