Python 如果概率密度函数数据为x和y,则计算百分位数
我从pdf图表中提取数据,其中x代表孵化时间,y代表csv文件中的密度。我想计算百分位数,比如95%。我有点困惑,我是否应该只使用x值计算百分位,即使用Python 如果概率密度函数数据为x和y,则计算百分位数,python,probability,distribution,kde,percentile,Python,Probability,Distribution,Kde,Percentile,我从pdf图表中提取数据,其中x代表孵化时间,y代表csv文件中的密度。我想计算百分位数,比如95%。我有点困惑,我是否应该只使用x值计算百分位,即使用np.prentile(x,0.95) 绘图中的数据: 下面是一些使用np.trapz(由@pjs提出)的代码。我们取x和y数组,假设它是PDF,所以首先我们将它规格化为1,然后开始向后搜索,直到达到0.95点。 我制作了一些多峰函数 import numpy as np import matplotlib.pyplot as plt N =
np.prentile(x,0.95)
绘图中的数据:
下面是一些使用np.trapz(由@pjs提出)的代码。我们取x和y数组,假设它是PDF,所以首先我们将它规格化为1,然后开始向后搜索,直到达到0.95点。 我制作了一些多峰函数
import numpy as np
import matplotlib.pyplot as plt
N = 1000
x = np.linspace(0.0, 6.0*np.pi, N)
y = np.sin(x/2.0)/x # construct some multi-peak function
y[0] = y[1]
y = np.abs(y)
plt.plot(x, y, 'r.')
plt.show()
# normalization
norm = np.trapz(y, x)
print(norm)
y = y/norm
print(np.trapz(y, x)) # after normalization
# now compute integral cutting right limit down by one
# with each iteration, stop as soon as we hit 0.95
for k in range(0, N):
if k == 0:
xx = x
yy = y
else:
xx = x[0:-k]
yy = y[0:-k]
v = np.trapz(yy, xx)
print(f"Integral {k} from {xx[0]} to {xx[-1]} is equal to {v}")
if v <= 0.95:
break
将numpy导入为np
将matplotlib.pyplot作为plt导入
N=1000
x=np.linspace(0.0,6.0*np.pi,N)
y=np.sin(x/2.0)/x#构造一些多峰函数
y[0]=y[1]
y=np.abs(y)
平面图(x,y,r.)
plt.show()
#规范化
norm=np.trapz(y,x)
印刷品(标准)
y=y/标准值
归一化后的打印(np.trapz(y,x))#
#现在计算积分,将右极限减一
#在每次迭代中,一旦达到0.95,就停止
对于范围(0,N)内的k:
如果k==0:
xx=x
yy=y
其他:
xx=x[0:-k]
yy=y[0:-k]
v=np.trapz(yy,xx)
print(f“从{xx[0]}到{xx[-1]}的积分{k}等于{v}”)
如果v我测试了@Severin-Pappadeux方法和np.percentile,bith给出了95%的相同结果
此处代码为@Severin Pappadeux,但使用的数据如下:
import numpy as np
import matplotlib.pyplot as plt
x = [ 5. , 5.55, 6.1 , 6.65, 7.2 , 7.75, 8.3 , 8.85, 9.4 ,
9.95, 10.5 , 11.05, 11.6 , 12.15, 12.7 , 13.25, 13.8 , 14.35,
14.9 , 15.45, 16. ]
y = [0.03234577, 0.03401444, 0.03559847, 0.03719304, 0.03890566,
0.04084201, 0.04309067, 0.04570878, 0.04871024, 0.05205822,
0.05566298, 0.05938525, 0.06304516, 0.06643575, 0.06933978,
0.07154828, 0.07287886, 0.07319211, 0.0724044 , 0.0704957 ,
0.0675117 ]
N = len(x)
y[0] = y[1]
y = np.abs(y)
plt.plot(x, y, 'r.')
plt.show()
# normalization
norm = np.trapz(y, x)
print(norm)
y = y/norm
print(np.trapz(y, x)) # after normalization
# now compute integral cutting right limit down by one
# with each iteration, stop as soon as we hit 0.95
for k in range(0, N):
if k == 0:
xx = x
yy = y
else:
xx = x[0:-k]
yy = y[0:-k]
v = np.trapz(yy, xx)
print(f"Integral {k} from {xx[0]} to {xx[-1]} is equal to {v}")
if v <= 0.95:
break
# Outputs =
# 0.6057000785
# 1.0
# Integral 0 from 5.0 to 16.0 is equal to 1.0
# Integral 1 from 5.0 to 15.45 is equal to 0.9373418687777172
因此,两种方法都给了我15.45作为x的95个百分位数,你想要x&y值的百分位数吗?或者你想在情节中注释它?@泽克我想要X的前科,但是我不应该考虑PDF(Y值)吗?百分位数是基于PDF值的。第95个百分位是x值,pdf下95%的区域位于其左侧(或5%位于右侧)。用微积分的术语来说,从无穷大到x的积分是0.95。经过一点探索,它看起来可能就是你想要的。假设你将二维数组设为arr
,并将x
值设为第二个一维数组。你可以这样做来得到百分位数<代码>np.百分位数(arr[1],0.95)
。希望这有帮助!您好@Severin Pappadeux,非常感谢您的代码,我运行了代码并将其与np.percentile的结果进行了比较,两者都给出了相同的结果。@sakurami如果您有np.percentile的替代版本,请将其作为另一个答案发布,我会支持它——它肯定会让寻找答案的人受益。@sakurami如果你不想共享实际数据,你甚至可以从我的代码中选择Y作为x的函数
np.percentile(x, 95)
# Output= 15.45