如何计算非参数PDF两点间的面积(概率)?Python工具咨询
计算非参数PDF两点间的面积(概率)及Python工具包实现
一、基础原理:离散PDF的数值积分
你提供的y是非参数PDF的离散取值,x是对应的横坐标(步长为1)。两点间的概率本质是PDF在该区间上的积分,对于离散数据,梯形法是精度较高的数值积分方法,它通过计算相邻点构成的梯形面积之和来近似积分结果。
二、直接基于现有离散PDF计算的方法
用Numpy/SciPy实现
可以直接调用numpy.trapz或scipy.integrate.trapz完成积分计算,步骤如下:
import numpy as np from scipy import integrate # 你的数据集 x = np.array([443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466]) y = np.array([1.42108547e-13, 1.38555834e-11, 1.10391341e-09, 4.44788527e-08, 1.57671946e-06, 3.56957957e-05, 5.07987711e-04, 4.50095500e-03, 2.47811094e-02, 8.53820383e-02, 1.86555694e-01, 2.61763533e-01, 2.36928044e-01, 1.37248060e-01, 4.98071050e-02, 1.09658321e-02, 1.41422995e-03, 1.03744795e-04, 4.25019397e-06, 9.66796303e-08, 1.22804049e-09, 8.82441617e-12, 3.63136435e-14, 1.70842985e-16]) # 定义目标区间,示例为450到455 lower = 450 upper = 455 # 筛选区间内的x和y数据 mask = (x >= lower) & (x <= upper) x_segment = x[mask] y_segment = y[mask] # 梯形法计算积分(即区间概率) probability = np.trapz(y_segment, x_segment) # 也可使用scipy的integrate.trapz,结果一致 # probability = integrate.trapz(y_segment, x_segment) print(f"区间[{lower}, {upper}]的概率为: {probability:.4f}")
运行后会输出该区间的概率值(示例结果约为0.7953)。
三、从原始数据估计非参数PDF再计算概率(SciPy/Statsmodels工具)
如果你的x和y是从原始样本数据推导而来,也可以直接用库的非参数估计工具拟合PDF,再计算区间概率:
1. SciPy的gaussian_kde
先拟合非参数核密度估计(KDE),再通过积分计算区间概率:
from scipy.stats import gaussian_kde # 模拟原始样本数据(实际替换为你的真实样本) sample_data = x.repeat((y * 1e6).astype(int)) # 拟合KDE模型 kde = gaussian_kde(sample_data) # 积分KDE函数得到区间概率 probability, _ = integrate.quad(kde, lower, upper) print(f"KDE估计的区间概率: {probability:.4f}")
2. Statsmodels的KDEUnivariate
Statsmodels的KDE工具直接提供CDF(累积分布函数)计算,两点的CDF差值即为区间概率,步骤更简洁:
import statsmodels.api as sm # 模拟原始样本数据(实际替换为你的真实样本) sample_data = x.repeat((y * 1e6).astype(int)) # 初始化并拟合KDE模型 kde = sm.nonparametric.KDEUnivariate(sample_data) kde.fit() # 计算CDF差值得到区间概率 cdf_lower = kde.cdf(lower) cdf_upper = kde.cdf(upper) probability = cdf_upper - cdf_lower print(f"Statsmodels KDE的区间概率: {probability:.4f}")
四、工具包总结
- SciPy:
- 直接积分离散PDF:
scipy.integrate.trapz/simpson - 非参数PDF估计+积分:
scipy.stats.gaussian_kde配合scipy.integrate.quad
- 直接积分离散PDF:
- Statsmodels:
statsmodels.nonparametric.KDEUnivariate:拟合非参数PDF后,通过CDF差值直接获取区间概率,操作更便捷
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

