Nat*_*mas 4 python numpy scipy probability-density
我有一些正态分布的数据,并且已经装有pdf。但是,我想从数据集中获得给定值的可能性。据我了解,这是x值所在的pdf下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]
Run Code Online (Sandbox Code Playgroud)
然后,我可以生成此数据的直方图,并为其拟合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()
Run Code Online (Sandbox Code Playgroud)
我可以检索给定x值的f(x)(在这种情况下为0.65)
print(stats.norm.pdf(0.65, np.mean(mb1), np.std(mb1)))
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我从中产生我的可能性吗?
我已经将输出的直方图附加了pdf。

理想情况下,您要做的是在希望概率发生的事件范围内对概率密度函数进行积分。这是一些代码:
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')
Run Code Online (Sandbox Code Playgroud)
它将产生一个以4为中心,sigma为2的正态分布。下图以红线表示pdf,以紫线表示cdf。cdf只是pdf从负无穷大到计算它的值的整数。因此,要获得某个范围内pdf的积分,您只需要将范围的两个端点的cdf值相减即可。

现在,您可以问--100到4之间的值的概率是多少?
print ss.norm.cdf(4, 4, 2) - ss.norm.cdf(-100, 4, 2)
Run Code Online (Sandbox Code Playgroud)
这将导致的预期答案0.5,相当于整个分布的一半(几乎)。因此,对于您的情况,您可能会对看到0.60到0.70之间的值的可能性感兴趣:
print ss.norm.cdf(0.70, 4, 2) - ss.norm.cdf(0.60, 4, 2)
Run Code Online (Sandbox Code Playgroud)
这将导致以下几率很小:
0.00490600527511
Run Code Online (Sandbox Code Playgroud)
我应该注意,0.65本身的“概率”是没有意义的,因为您具有连续的概率分布,而0.65的确切值只是其很小的一部分,因此其概率为0。