Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据经验数据从KDE中抽取样本(计算熵)_Python_Scikit Learn_Kernel Density_Probability Density - Fatal编程技术网

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

Python 根据经验数据从KDE中抽取样本(计算熵),python,scikit-learn,kernel-density,probability-density,Python,Scikit Learn,Kernel Density,Probability Density,我试图计算两个数值数组之间的熵(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.0003

我试图计算两个数值数组之间的熵(
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中抽取10000个随机样本的合适方法是什么呢?

KDE的
带宽默认为1,这太大了。请尝试使用类似以下内容:

kde_emp = KernelDensity(bandwidth=5e-5)
kde_emp.fit(emp_values.reshape(-1, 1))
将带宽设置为对此数据更合理的值。会议讨论了带宽的含义

我不知道scikit学习得很好,但是有没有什么好的方法可以自动估算这个值呢。i、 你必须自己编写估计器(大约5到10行代码)


也就是说,如果你只是在寻找一个高斯KDE,那么SciPy有一个可以为你估计带宽的KDE。看见请注意,scipy估计器假设数据是单峰的(与大多数估计器一样),而您的数据肯定不是,因此您需要一个较小的带宽值

,使用例如1e-6的带宽确实有帮助,并产生了预期的结果。谢谢我突然想到,您可能只需要从值中采样(替换)。请注意,您最好使用能够处理不同数据大小的度量。任何像这样的调整都会破坏方差的估计