我有一些正常分布的数据,我已经安装了pdf。但是,我想从数据集中获得给定值的可能性。根据我的理解,这是pdf下bin的区域,x的值位于其中。是否有numpy或scipy.stats函数来生成这个?我看过但要么我没有看到它,要么我缺乏理解阻碍了我。到目前为止,我有:
import h5py
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.mlab as mlab
import scipy.stats as stats
import numpy
import math
a = 'data.h5'
f = h5py.File(a,'r')
dset = f['/DATA/DATA/']
values = dset[...,0]
然后我可以生成这些数据的直方图并将pdf拟合到它:
n, bins, patches = plt.hist(values, 50, normed=1)
mu = np.mean(values)
sigma = np.std(values)
plt.plot(bins, mlab.normpdf(bins, mu, sigma))
plt.show()
我可以检索给定x值的f(x)(在这种情况下为0.65)
print(stats.norm.pdf(0.65, np.mean(mb1), np.std(mb1)))
有人能帮助我从中产生概率吗?
我已经将输出的直方图附加了pdf。
答案 0 :(得分:5)
您理想的做法是在您想要概率的事件范围内整合概率密度函数。这是一些代码:
import numpy as np
import scipy.stats as ss
a = ss.norm.rvs(4, 2, 40)
hist(a, normed=True)
xs = np.linspace(0, 10, 30)
plot(xs, ss.norm.pdf(xs, 4, 2), label='pdf')
plot(xs, ss.norm.cdf(xs, 4, 2), label='cdf')
它产生一个以4为中心的正态分布,其sigma值为2.下图用红线跟踪pdf,用紫色线跟踪cdf。 cdf只是从负无穷大到计算值的pdf的积分。因此,要在一定范围内获得pdf的积分,您只需在该范围的两个端点处减去cdf值。
现在你可以问一下在-100和4之间看到一个值的概率是多少?
print ss.norm.cdf(4, 4, 2) - ss.norm.cdf(-100, 4, 2)
这将导致0.5
的预期答案,其对应于(几乎)整个分布的一半。因此,在您的情况下,您可能会对看到0.60和0.70之间的值的概率感兴趣:
print ss.norm.cdf(0.70, 4, 2) - ss.norm.cdf(0.60, 4, 2)
哪个应该导致以下几率:
0.00490600527511
我应该注意到'概率' 0.65本身没有意义,因为你有一个连续的概率分布,而0.65的确切值是它的一个极小部分,所以它的概率为0.