2016-01-07 8 views
1

Я хочу создать гистограмму (из псевдослучайных чисел) с помощью моей функции распределения вероятности Гаусса, однако я не хочу, чтобы гистограмма превышала максимальную точку моего PDF. Вот мой код:Гистограмма на графике функции плотности вероятности Гаусса в Python

from math import sqrt, pi, exp 
from scipy.stats import norm 
import numpy as np 
import matplotlib.pyplot as plt 

mu = 0.5 
variance = 0.5 
sigma = sqrt(variance) 
npts = 100 

x = np.linspace(norm.ppf(0.01), norm.ppf(0.99), npts) 

#plot pdf 
plt.plot(x, norm.pdf(x, mu, sigma), lw=3, c='r', label='PDF') 

#RNG 
y = [-3, -2, -1, 0, -1, -2, -3] 
if y < 1./(sigma*sqrt(2*pi))*exp(-(mu**2/2*sigma**2)): 
    u = sigma * np.random.randn(100) + mu 
    plt.hist(u, histtype='bar', alpha=0.5) 
plt.show() 

Кто-нибудь знает, как это сделать или есть какие-то подсказки?

+0

Я не могу воспроизвести это на основе кода, который вы опубликовали (с этими импортами). 'From math import sqrt, pi, exp; от нормы импорта scipy.stats; импорт numpy как np; import matplotlib.pyplot as plt' –

+0

@JamieBull Спасибо, что указали это – lyche

ответ

0

Есть пара вопросов.

Во-первых, вам нужно использовать all(y), чтобы проверить все значения в списке в соответствии с условием создания гистограммы.

Во-вторых, чтобы сделать гистограмму аналогичного размера для вашего pdf-файла на диаграмме, вам понадобится использовать вторичную ось, так как значения совершенно разные.

#plot pdf 
fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 
ax1.plot(x, norm.pdf(x, mu, sigma), lw=3, c='r', label='PDF') 

#RNG 
y = [-3, -2, -1, 0, -1, -2, -3] 
if all(y) <= 1./(sigma * sqrt(2 * pi)) * exp(-(mu ** 2/2 * sigma ** 2)): 
    u = sigma * np.random.randn(100) + mu 
    ax2.hist(u, histtype='bar', alpha=0.5) 
plt.show() 
+0

Это не создает то, что я хочу ... Все бары слишком высоки (достижение до 23). Может быть, я не объяснил правильно ... Я хочу, чтобы максимальная высота гистограммы была максимальной точкой на моем pdf (так что она «вписывается» в гистограмму) – lyche

+0

У вас есть идеи? Благодаря! – lyche

+1

Большое спасибо Джейми !!! – lyche

-1

код ниже работает на моем компьютере
python 2.7.10 numpy 1.10.1 matplotlib 1.4.3 scipy 0.15.1

, но я не уверен, о том, как импортировать эти функции, вы должны размещать код, который будет поднимать ValueError, так что я могу ответить на ваш вопрос

import numpy as np 
from scipy.stats import norm 
from math import sqrt, pi, exp 
import matplotlib.pyplot as plt 

mu = 0.5 
variance = 0.5 
sigma = sqrt(variance) 
npts = 100 

x = np.linspace(norm.ppf(0.01), norm.ppf(0.99), npts) 

#plot pdf 
plt.plot(x, norm.pdf(x, mu, sigma), lw=3, c='r', label='PDF') 

#RNG 
y = [-3, -2, -1, 0, 1, 2, 3] 
if y < 1./(sigma * sqrt(2 * pi)) * exp(-(mu ** 2/2 * sigma ** 2)): 
    u = np.random.random(loc=mu, scale=sigma, size=100) 
    plt.hist(u, histtype='bar', alpha=0.5) 
plt.show() 

И за ошибки ...

по if y < 1./(sigma*sqrt(2*pi))*exp(-(mu**2/2*sigma**2)):
, что вы имеете в виду список из числа меньше чем число? все они? или любой из них? зависит от любого случая, вы можете использовать y.all или y.any

+0

Это должен быть комментарий (просить ОП для разъяснения), а не ответ. –

+0

максимальная точка PDF находится в 'x = 0' и' y = 1 ./ (sigma * sqrt (2 * pi)) * exp (- (mu ** 2/2 * sigma ** 2)) ' , следовательно, когда 'y <1 ./ (sigma * sqrt (2 * pi)) * exp (- (mu ** 2/2 * sigma ** 2))' он построит гистограмму – lyche

+0

Кроме того, это не производит гистограмма, только кривая PDF – lyche