从概率密度函数生成概率?
我有一些数据,这些数据是呈正态分布的,我已经为这些数据拟合了一个概率密度函数(pdf)。不过,我想知道某个特定值在这个数据集中出现的概率。根据我的理解,这个概率就是在pdf下,特定值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(在这个例子中是0.65)的f(x)值:
print(stats.norm.pdf(0.65, np.mean(mb1), np.std(mb1)))
有没有人能帮我从中计算出我的概率?
我附上了输出的直方图和pdf。
1 个回答
11
理想情况下,你想要做的就是在你想要计算概率的事件范围内,对概率密度函数进行积分。下面是一些代码:
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)。累积分布函数其实就是从负无穷到你计算的那个值的概率密度函数的积分。因此,要计算某个范围内的概率密度函数的积分,你只需要把这个范围两端的累积分布函数值相减就可以了。
现在你可以问,看到一个值在-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。