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

如何用Scipy集成一维KDE并可视化?代码正确性与方案咨询

代码合理性分析

你的代码逻辑上是合理的:scipy.stats.gaussian_kde的integrate_box_1d(-np.inf, x)确实能计算KDE拟合得到的概率密度函数(PDF)在区间(-∞, x)上的积分,也就是**累积分布函数(CDF)**在x处的值。但它存在效率问题:循环逐个调用integrate_box_1d会重复计算内核,对于大数据集来说速度较慢。

优化后的正确方案

integrate_box_1d支持直接传入数组作为第二个参数,无需循环,能一次性计算所有数据点的CDF值,效率更高:

import numpy as np
import scipy.stats

X = np.array([0.21,0.21,0.21,0.28,0.30,0.30,0.24,0.22,0.19,0.20,0.18,0.23,0.20,0.12,0.14,0.13,0.18,0.15,0.13,0.11,0.12,0.11,0.10,0.13,0.03,0.07,0.17,0.16])
kde = scipy.stats.gaussian_kde(X, bw_method=None, weights=None)

# 批量计算所有数据点的CDF值
cdf_values = kde.integrate_box_1d(-np.inf, X)
print(cdf_values)
PDF与CDF的可视化方案

用matplotlib可以直观展示PDF和对应的CDF,建议生成更密集的x轴点让曲线更平滑:

import matplotlib.pyplot as plt

# 生成覆盖数据范围且略有扩展的密集x轴
x_min = X.min() - 0.05
x_max = X.max() + 0.05
x_grid = np.linspace(x_min, x_max, 1000)

# 计算PDF和CDF值
pdf_values = kde(x_grid)
cdf_values_grid = kde.integrate_box_1d(-np.inf, x_grid)

# 创建双图布局
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))

# 绘制PDF曲线与原始数据点
ax1.plot(x_grid, pdf_values, color='blue', label='KDE PDF')
ax1.scatter(X, np.zeros_like(X), color='red', alpha=0.5, label='原始数据')
ax1.set_title('KDE概率密度函数(PDF)')
ax1.set_xlabel('x')
ax1.set_ylabel('概率密度')
ax1.legend()
ax1.grid(True)

# 绘制CDF曲线与数据点对应CDF值
ax2.plot(x_grid, cdf_values_grid, color='green', label='KDE CDF')
ax2.scatter(X, kde.integrate_box_1d(-np.inf, X), color='red', alpha=0.5, label='数据点累积概率')
ax2.set_title('KDE累积分布函数(CDF)')
ax2.set_xlabel('x')
ax2.set_ylabel('累积概率')
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()

这段代码会生成两个子图:上方是PDF曲线并标记原始数据点,下方是CDF曲线并标记每个数据点对应的累积概率值,能清晰呈现两者的关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:16