从概率密度函数生成概率?

4

我有一些正态分布数据,并拟合了一个概率密度函数。但是,我想获取给定值发生的可能性概率。据我所知,这就是在pdf下x值所在的bin的面积。是否有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]

我可以根据这些数据生成一个直方图,并拟合一个概率密度函数:

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值(在此情况下为0.65)的f(x)。

print(stats.norm.pdf(0.65, np.mean(mb1), np.std(mb1)))  

有人可以帮助我从这个图中生成概率吗?

我已经附上了带有PDF的直方图输出。

带有PDF的直方图

1个回答

10

理想情况下,您应该在您所需概率的事件范围内对概率密度函数进行积分。以下是一些代码:

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为中心值,2为标准差的正态分布图像如下所示。红线表示概率密度函数(PDF),紫线表示累积分布函数(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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接