如何基于Scikit-learn实现非负观测值的变换Kernel Density Estimator?
解决Scikit-learn KDE对数变换建模的问题
我来帮你搞定这个对数变换结合KDE的问题——核心是要记住变换后的密度函数必须做雅可比行列式修正,这也是你之前代码出错的关键!
为什么要做对数变换?
原始的高斯KDE会把密度延伸到负半轴,导致采样出负值(成本不可能为负)。通过对数变换y = ln(x),把正的成本x映射到全体实数y,这样高斯KDE就可以安全拟合,之后再把结果转换回原始空间即可。
你的代码哪里错了?
- 未处理0值:
ln(0)是无穷大,直接对原始成本取对数会报错; - 带宽不匹配:原始的
bandwidth=612是针对成本数值的,对数空间的数值范围小得多,这个带宽会让KDE完全失效; - 密度计算逻辑错误:你试图直接用索引取
pdf_pseudo的值,还错误地用了apply,实际上应该用score_samples计算网格点的密度,再做雅可比修正; - 语法错误:最后生成output的代码语法不对,应该用字典而非list。
修正后的完整代码
1. 数据预处理与对数变换
首先确保原始数据没有0(加个极小的epsilon避免对数报错),然后做变换:
import numpy as np import pandas as pd from sklearn.neighbors import KernelDensity import math # 假设costs是你的DataFrame列(比如costs = df['repair_cost']) epsilon = 1e-6 # 避免ln(0)报错 x = costs.values.reshape(-1, 1) # 转成scikit-learn要求的(n_samples, 1)形状 x_log = np.log(x + epsilon) # 对数变换
2. 拟合对数空间的KDE
注意这里的带宽需要重新选择(可以用交叉验证调优,比如GridSearchCV),不能直接用原始空间的带宽:
# 示例带宽(你可以根据自己的数据调整,比如用交叉验证找最优值) kde_log = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(x_log)
3. 计算原始空间的概率密度函数(PDF)
这里必须做雅可比修正:因为y = ln(x),所以dx/dy = x = e^y,原始空间的PDF f(x) = f_y(y) * (1/x),其中f_y(y)是对数空间的KDE密度:
# 生成原始成本空间的网格 maxVal = x.max() minVal = x.min() upperBound = math.ceil(maxVal / 1000) * 1000 x_grid = np.linspace(minVal, upperBound, 1000).reshape(-1, 1) # 对网格点做对数变换 x_grid_log = np.log(x_grid + epsilon) # 计算对数空间的log密度,转换为概率密度 log_pdf_log = kde_log.score_samples(x_grid_log) pdf_log = np.exp(log_pdf_log) # 雅可比修正得到原始空间的PDF pdf_original = pdf_log / x_grid.flatten() # x_grid是二维数组,转成一维对应每个点
4. 从分布中采样正的成本值
先从对数空间的KDE采样,再通过指数变换转换回原始空间,确保样本都是正数:
n_samples = 1000 # 你需要的样本数量 samples_log = kde_log.sample(n_samples) samples_original = np.exp(samples_log) - epsilon # 减去之前加的epsilon # 双重保险:确保没有负值(理论上不会出现,但处理更稳妥) samples_original = np.maximum(samples_original, 0)
额外提示:带宽调优
对数空间的带宽对结果影响很大,推荐用交叉验证选择最优值:
from sklearn.model_selection import GridSearchCV params = {'bandwidth': np.logspace(-1, 1, 20)} grid = GridSearchCV(KernelDensity(kernel='gaussian'), params) grid.fit(x_log) print(f"最优带宽: {grid.best_params_['bandwidth']}")
内容的提问来源于stack exchange,提问作者Dionne Theuws
相关产品推荐
相关产品推荐

