将核密度估计器转换为非负观测值

问题描述 投票:0回答:0

我正在使用 Python 中的 scikit learn 包的内核密度估计器对修复成本的分布进行建模。我已经创建了适合我的观察结果的密度函数,但是当从此分布中随机抽取样本时,会出现负值。由于观察结果涉及成本,而成本始终为正,因此样本值应该是非负的。

我读到通过数据转换可以达到这个结果。这些来源使用对数变换将分布截断为 0(收入分布的对数变换核密度估计具有有限支持的随机变量的核密度估计 — 变换技巧)。问题是我不知道如何将我的观察结果的对数转换与 scikit learn Kernal Density 函数结合使用。

未转换的KDE代码如下:

import numpy as np
from sklearn.neighbors import KernelDensity
import math as math

'Dataframe with costs'
x = costs

maxVal = x.max()
minVal = x.min()
upperBound = math.ceil(maxVal/1000)*1000

x_grid = np.linspace(0, upperBound, 1000)

'Create pdf with Kernel Density'
kde = KernelDensity(kernel='gaussian', bandwidth=612).fit(x_grid[:, np.newaxis])
log_pdf = kde.score_samples(x_grid[:, np.newaxis])
pdf=np.exp(log_pdf)

我的代码包括转换:

'Log tranformation and creation of pdf'

x_pseudo = x.apply(np.log)

kde_psuedo = KernelDensity(kernel='gaussian', bandwidth=612).fit(x_pseudo[:, np.newaxis])
log_pdf_pseudo = kde_psuedo.score_samples(x_pseudo[:, np.newaxis])
pdf_pseudo=np.exp(log_pdf_pseudo)

x_grid_log = np.linspace(minVal, maxVal, 1000)

density = np.zeros(len(x_grid_log))

for i in range(len(x_grid_log)):
    xx=x_grid_log[i]
    density[i]=pdf_pseudo[xx.apply(np.log)/xx]

output = list(x=x_grid_log, y=density)  

这段代码基于源代码2中的示例,是用R编写的。我知道代码是错误的,但我不知道如何解决这个问题。任何帮助将不胜感激!

python scikit-learn transformation kernel-density
© www.soinside.com 2019 - 2024. All rights reserved.