4

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

pdf覆盖的直方图

4

1 回答 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 值为中心且 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。

于 2014-03-11T19:23:26.217 回答