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

核密度估计(KDE)值出现负值后,如何重新缩放?

解决KDE负值截断后的重新缩放问题

1. 先处理负值截断

把原始KDE结果中所有小于0的数值替换为0,得到截断后的KDE数组,记为truncated_kde。

2. 计算截断后KDE的积分

因为KDE是在离散点上计算的,用数值积分方法(比如梯形法)计算积分:

  • 假设你有计算KDE对应的横坐标采样点x_grid(均匀/非均匀间隔均可)
  • 用梯形法计算truncated_kde在x_grid上的积分,得到total_area

3. 归一化缩放

将truncated_kde的每个值除以total_area,得到满足PDF核心要求(积分=1)的缩放后KDE,公式为:

scaled_kde[i] = truncated_kde[i] / total_area

4. 匹配最接近的已知PDF

通过最小化拟合误差来筛选最优PDF:

  • 根据数据分布特征选择候选PDF家族(如正态、伽马、Beta分布等)
  • 对每个候选PDF,用极大似然估计或矩估计法拟合参数
  • 计算候选PDF在x_grid上的取值,与scaled_kde计算误差(如均方误差MSE、平均绝对误差MAE)
  • 选择误差最小的PDF作为最优匹配

Python代码示例

import numpy as np
from scipy.integrate import trapezoid
from scipy.stats import norm, gamma
from sklearn.neighbors import KernelDensity

# 假设已有原始数据data和KDE计算网格x_grid
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(data.reshape(-1, 1))
original_kde = np.exp(kde.score_samples(x_grid.reshape(-1, 1)))

# 1. 截断负值
truncated_kde = np.maximum(original_kde, 0)

# 2. 计算积分
total_area = trapezoid(truncated_kde, x_grid)

# 3. 缩放归一化
scaled_kde = truncated_kde / total_area

# 4. 筛选最优PDF
candidates = [('正态分布', norm), ('伽马分布', gamma)]
min_error = float('inf')
best_pdf_info = None

for name, dist in candidates:
    params = dist.fit(data)
    pdf_vals = dist.pdf(x_grid, *params)
    mse = np.mean((scaled_kde - pdf_vals)**2)
    if mse < min_error:
        min_error = mse
        best_pdf_info = (name, params, mse)

print(f"最接近的PDF是{best_pdf_info[0]},参数为{best_pdf_info[1]},MSE={best_pdf_info[2]:.4f}")

注意点

  • 若原始KDE负值占比高,建议先调整带宽(带宽过小易出现负值)再重复流程
  • 数值积分精度依赖x_grid的密度,网格点越密积分结果越准确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:20:31