You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算非参数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
  • Statsmodels:
    • statsmodels.nonparametric.KDEUnivariate:拟合非参数PDF后,通过CDF差值直接获取区间概率,操作更便捷

内容的提问来源于stack exchange,提问作者Ganesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:07:19