为多个高斯函数编写python代码

时间:2018-09-09 10:13:33

标签: python gaussian

我正在尝试编写python代码,该代码将为多个相同的高斯函数创建图。在在线图形计算器中,它看起来像这样:

desired output

但是当尝试使用numpymatplotlib进行操作时,我得到以下信息:

problematic plot in python

我在做什么错?这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

b = 10 ** 6
L = 50
N = 5
sigma = np.power(10, 3)

x = np.linspace(0, L, 1000)

def gaussian(x, dk, sigma):
    return np.exp(-np.power((x - dk) / sigma, 2.) / 2.)

y = 6 * gaussian(np.linspace(0, L, 1000), L / 4., np.power(10., -2.)) + 6 * gaussian(np.linspace(0, L, 1000), L / 2., np.power(10., -2.)) + 6 * gaussian(np.linspace(0, L, 1000), .75 * L, np.power(10., -2.))

plt.plot(x, y)
plt.show()

2 个答案:

答案 0 :(得分:0)

您观察到的是采样伪像。 让我们介绍一个名为n_sample的参数。此参数为我们提供在给定间隔内评估功能的点数。

import numpy as np
import matplotlib.pyplot as plt
def gaussian(x,dk,sigma):
    return np.exp(-np.power((x-dk)/sigma,2.) / 2.)

L=50
n_sample=10000
x = np.linspace(0,L,n_sample)
y = 6*gaussian(np.linspace(0,L,n_sample),L/4., np.power(10.,-2.)) + 6*gaussian(np.linspace(0,L,n_sample), L/2., np.power(10.,-2.)) +  6*gaussian(np.linspace(0,L,n_sample), .75*L, np.power(10.,-2.))

plt.plot(x,y)
plt.title("n_sample={}".format(n_sample))
plt.show()

我为n_sample用不同的值绘制了函数。 您会看到,如果将n_sample增加到足够大的值,则可以正确表示数据。

具有1万个样本: 10k

有1000个样本: 1000

只有100个样本。注意y比例的变化: 100

答案 1 :(得分:0)

您在高斯函数中有错别字,这与您提到的样本不同。但是不必说“错”,因为它只会影响标准偏差值。

应该代替np.exp(-np.power((x-dk)/sigma,2.) / 2.)

np.exp(-np.power((x-dk),2.) /( sigma / 2.))

编辑:和sigma应该为10 ^ -3才能复制提供的示例。但是现在我只使用10 ^ -2,因为小的偏差会使事情变得过于敏感。

Sigma非常小,以至于高斯函数对采样大小非常敏感。

但是解决此问题将无法获得理想的结果,您会注意到低于1000时,中间的条形仍然更低。

Gauss_3

为什么?

首先,您需要注意:

  

高斯函数并非主要用于生成阶跃函数。

让我们看一下有关采样的更详细的示例,它与统计信息有些关系。


N = 100

for i in range(50):
    y += 6*gaussian(x, i, np.power(10.,-3.)) 

n_100

该图会发生什么?为什么中间会掉线?

原因是高斯函数是概率的近似值。可以说人类被新的流感消灭了。幸好只有100人能够幸存,现在我们选择50人,并检查有多少人被感染(其中1人受到感染)。

那么,从50个人中选择50个人的概率是多少?我们如何确定告诉某人某组有人受到拐弯呢?

  

回答:1,请确保您选择了全部50个其中的一部分必须曲折

那么,从50个人中选择25个人的概率是多少?我们如何确定告诉某人某组有人受到拐弯呢?

  

回答:1 / nCr(50,25)〜= 0

顺便说一下,这次高斯函数对于低采样量并不是一个很好的近似。 (由于中心极限定理wiki


N = 10000

我减少了一些采样点以节省时间,所以

for i in range(0, 10000, 100):
    y += 6*gaussian(x, i, np.power(10.,-3.)) 

Gauss_2

是一样的,要从几万中选择几千,仍然很难区分。


对于100个样本,多选一个人进行计数的概率差异非常明显。

50人中有49人与50人中有48人有很大的不同,因为泳池总数只有100人。

但是对于10000,在50人中有49人,在50人中有48人在乎?它们几乎与那个巨大的池相同。这就是为什么您可以制作三个具有相同高度的条形物

P.S。我所说的基本上是中心极限定理的思想,为什么当池很大时,抽样量与说真实值不会有很大的不同,这就是为什么我们可以进行“抽样”来表示整个池。