Python - 从numpy数组分布计算pdf

时间:2017-08-02 15:24:20

标签: python arrays numpy probability-density

给定一个值数组,我希望能够为它调整密度函数并找到任意输入值的pdf。这可能吗,我该怎么做呢?没有必要对正常性做出假设,我也不需要这个功能本身。

例如,给定:

x = array([ 0.62529759, -0.08202699,  0.59220673, -0.09074541,  0.05517865,
        0.20153703,  0.22773723, -0.26229708,  0.76137555, -0.61229314,
        0.27292745,  0.35596795, -0.01373896,  0.32464979, -0.22932331,
        1.14796175,  0.17268531,  0.40692172,  0.13846154,  0.22752953,
        0.13087359,  0.14111479, -0.09932381,  0.12800392,  0.02605917,
        0.18776078,  0.45872642, -0.3943505 , -0.0771418 , -0.38822433,
       -0.09171721,  0.23083624, -0.21603973,  0.05425592,  0.47910286,
        0.26359565, -0.19917942,  0.40182097, -0.0797546 ,  0.47239264,
       -0.36654449,  0.4513859 , -0.00282486, -0.13950512, -0.05375369,
        0.03331833,  0.48951555, -0.13760504,  2.788     , -0.15017848,
        0.02930675,  0.10910646,  0.03868301, -0.048482  ,  0.7277376 ,
        0.08841259, -0.10968462,  0.50371324,  0.86379698,  0.01674877,
        0.19542421, -0.06639165,  0.74500856, -0.10148342,  0.02482331,
        0.79195804,  0.40401969,  0.25120005,  0.21020794, -0.01767013,
       -0.13453783, -0.09605592, -0.88044229,  0.04689623,  0.09043851,
        0.21232286,  0.34129982, -0.3736799 ,  0.17313858])

我想找到0.3的值与上述所有值的比较,以及上述值的百分比大于。

3 个答案:

答案 0 :(得分:1)

我个人喜欢使用scipy.stats软件包。它具有内核密度估计的有用实现。从根本上讲,它是使用高斯(或其他)分布的组合来估算某些数据的概率密度函数。您可以设置使用哪个分布。在此处查看文档和相关示例:https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#kernel-density-estimation

有关KDE的更多信息:https://en.wikipedia.org/wiki/Kernel_density_estimation

一旦构建了KDE,就可以对它执行相同的操作以获得概率。例如,如果要计算出现值大于或等于0.3的概率,则可以执行以下操作:

kde = stats.gaussian_kde(np.array(x))

#visualize KDE
fig = plt.figure()
ax = fig.add_subplot(111)
x_eval = np.linspace(-.2, .2, num=200)
ax.plot(x_eval, kde(x_eval), 'k-')

#get probability
kde.integrate_box_1d( 0.3, np.inf)

TLDR: 计算KDE,然后像使用PDF一样使用KDE。

答案 1 :(得分:0)

您可以使用openTURNS。您可以使用高斯内核平滑来轻松完成!来自doc

import openturns as ot 
kernel = ot.KernelSmoothing()
estimated = kernel.build(x)

那就是它,现在你有了一个分发对象:)

这个库非常酷! (我与他们无关)。

答案 2 :(得分:0)

我们首先要从Numpy Wish创建Sample。 然后,我们使用分布的array方法来计算互补CDF(与Yoda的答案相比有很小的改进)。

complementaryCDF

打印:

import numpy as np
x = np.array([ 0.62529759, -0.08202699,  0.59220673, -0.09074541,  0.05517865,
        0.20153703,  0.22773723, -0.26229708,  0.76137555, -0.61229314,
        0.27292745,  0.35596795, -0.01373896,  0.32464979, -0.22932331,
        1.14796175,  0.17268531,  0.40692172,  0.13846154,  0.22752953,
        0.13087359,  0.14111479, -0.09932381,  0.12800392,  0.02605917,
        0.18776078,  0.45872642, -0.3943505 , -0.0771418 , -0.38822433,
       -0.09171721,  0.23083624, -0.21603973,  0.05425592,  0.47910286,
        0.26359565, -0.19917942,  0.40182097, -0.0797546 ,  0.47239264,
       -0.36654449,  0.4513859 , -0.00282486, -0.13950512, -0.05375369,
        0.03331833,  0.48951555, -0.13760504,  2.788     , -0.15017848,
        0.02930675,  0.10910646,  0.03868301, -0.048482  ,  0.7277376 ,
        0.08841259, -0.10968462,  0.50371324,  0.86379698,  0.01674877,
        0.19542421, -0.06639165,  0.74500856, -0.10148342,  0.02482331,
        0.79195804,  0.40401969,  0.25120005,  0.21020794, -0.01767013,
       -0.13453783, -0.09605592, -0.88044229,  0.04689623,  0.09043851,
        0.21232286,  0.34129982, -0.3736799 ,  0.17313858])
import openturns as ot 
kernel = ot.KernelSmoothing()
sample = ot.Sample(x,1)
distribution = kernel.build(sample)
q = distribution.computeComplementaryCDF(0.3)
print(q)