根据经验数据从KDE抽取样本(以计算熵)

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

我正在尝试计算两个数值数组之间的熵(scipy.stats.entropy),以量化其基本分布的差异。

由于计算熵要求两个输入都具有相同的形状,我想使用KDE估计较小列表的分布,以从中采样新数据。

使用0到1e-02之间的输入,我无法从拟合的KDE中得出合理的数字?

emp_values = np.array([0.000618, 0.000425, 0.000597, 0.000528, 0.000393, 0.000721,
   0.000674, 0.000703, 0.000632, 0.000383, 0.000466, 0.000919,
   0.001419, 0.00063 , 0.000433, 0.000516, 0.001419, 0.000655,
   0.000674, 0.000676, 0.000694, 0.000396, 0.000688, 0.00061 ,
   0.000687, 0.000633, 0.000601, 0.00061 , 0.000747, 0.000356,
   0.000824, 0.000931, 0.000691, 0.000907, 0.000553, 0.000748,
   0.000828, 0.000907, 0.000457, 0.000494])
kde_emp = KernelDensity().fit(emp_values.reshape(-1, 1))

使用KDE.sample绘制随机数会得出值完全超出范围吗?

kde_emp.sample(10)
array([[-3.0811253 ],
   [ 1.24822136],
   [ 0.07815318],
   [ 0.01609681],
   [-0.59676707],
   [-0.89988083],
   [-0.59071966],
   [-0.72741754],
   [ 0.82296101],
   [ 0.08329316]])

然后从合适的PDF中抽取10.000个随机样本的适当方法是什么?

python scikit-learn kernel-density probability-density
1个回答
0
投票

KDE的bandwidth默认为1,这太大了。尝试使用类似这样的东西:

kde_emp = KernelDensity(bandwidth=5e-5)
kde_emp.fit(emp_values.reshape(-1, 1))

将带宽设置为对此数据更敏感。 wikipedia page讨论带宽意味着什么

我不太了解scikit-learn,但是there doesn't seem to be任何在其中自动估计此值的好方法。即您必须自己编写自己的估算器(约5至10行代码)

就是说,如果您只是在追求高斯KDE,那么SciPy就会为您估算带宽。参见scipy.stats.gaussian_kde。请注意,scipy估算器假定数据是单峰的(与大多数情况一样),而您的数据当然不是,因此您需要较小的带宽值

© www.soinside.com 2019 - 2024. All rights reserved.