给定一个值数组,我希望能够为它调整密度函数并找到任意输入值的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的值与上述所有值的比较,以及上述值的百分比大于。
答案 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)