如何用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
相关产品推荐
相关产品推荐

