簡體   English   中英

將高斯轉換為直方圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM