python 中的 Kullback-Leibler 散度与分类数据

Kullback-Leibler Divergence in python with categorical data

我正在比较分类数据的两个分布。我有一个 SQL table,转换成一个数据框,然后我使用它获取每个类别中的值的计数。但是,与其手动执行此过程,我没有看到太多支持或规范的方法来执行此操作。当然,如果我比较两个分布,我希望 bins 是有序的并且在两个分布中是相同的。而不是非常手动地执行此操作。

有没有一种聪明的方法可以让创建的分布共享相同的分类容器?其中一个分布如下:

engines = df[df['engine'] == 'unity']['category'].value_counts()
print(engines)
np.histogram(engines, density=True)

最后的数据如下所示:

cat 1                 99940
cat 2                 44259
cat 3                 225
cat 4                 31
Name: engine, dtype: int64

这对于另一个查询是重复的,因为有两个分布可以进行比较。但是我找不到任何方法来确保我们在多个发行版中拥有统一的类别。

一旦我有了两个发行版,就会发生以下 KLD:

scipy.special.kl_div(engines, engines_two)

看来你只是在问:

pd.crosstab(df['category'], df['engine'])

您可能想将 normalize='column' 放入函数中。然后你可以将你的分布作为列。