Искам да създам хистограма (от псевдослучайнас функцията на Гаусовата вероятностна разпределение, обаче, не искам хистограмата да надвишава максималната точка на моя PDF. Ето моят код досега:
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 за отговор № 1Има няколко въпроса.
Първо, трябва да използвате 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()
-1 за отговор № 2
Кодът по-долу работи на моя компютър
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