从pdf生成概率?

时间:2014-03-11 18:32:14

标签: python numpy scipy probability-density

我有一些正常分布的数据,我已经安装了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。

histogram with pdf overlain

1 个答案:

答案 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值。

enter image description here

现在你可以问一下在-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.