根据经验数据从 KDE 中抽取样本(计算熵)
Draw samples from KDE based on empirical data (to calculate entropy)
我正在尝试计算两个数值数组之间的熵 (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 个随机样本的合适方法是什么?
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 行代码)
就是说,如果您只是想使用 Gaussian KDE,那么 SciPy 有一个可以为您估算带宽的。参见 scipy.stats.gaussian_kde
。请注意,scipy 估算器假定数据是单峰的(大多数情况下都是如此),而您的数据肯定不是,因此您需要更小的带宽值
我正在尝试计算两个数值数组之间的熵 (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 个随机样本的合适方法是什么?
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 行代码)
就是说,如果您只是想使用 Gaussian KDE,那么 SciPy 有一个可以为您估算带宽的。参见 scipy.stats.gaussian_kde
。请注意,scipy 估算器假定数据是单峰的(大多数情况下都是如此),而您的数据肯定不是,因此您需要更小的带宽值