我同意@Nir Friedman 的观点,贝叶斯方法在这里很合适,所以我继续用 Python 实现了它。由于统一先验与多项分布共轭,我们可以在没有任何花哨的 MCMC/HMC 的情况下实现它。首先,我导入了一些库并定义了一个计算熵的函数:
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
def entropy(x):
return np.sum( -x*np.log2(x) , axis=-1)
然后,我从熵的后验分布中提取蒙特卡洛样本。这是分两步完成的:
- 首先,请注意真正多项式比例的后验分布是狄利克雷。我们可以在 Python 中用一行代码对其进行采样:
np.random.dirichlet(counts_die+1, 1000000)
- 根据该狄利克雷分布计算每个样本的熵
代码如下:
counts_die_1 = np.array([6,7,3,5,2,1])
counts_die_2 = np.array([3,4,2,1,1,2])
entropy_die_1 = entropy(np.random.dirichlet(counts_die_1+1, 1000000))
entropy_die_2 = entropy(np.random.dirichlet(counts_die_2+1, 1000000))
然后,我们可以绘制熵之间差异的分布:
sns.kdeplot(entropy_die_1-entropy_die_2, fill=True)
plt.axvline(0, ls="--", c="k")
# changing plot aesthetics
plt.gca().set(yticklabels=[], ylabel="", xlabel="Difference in entropy, in bits")
plt.gca().tick_params(left=False)
sns.despine(left=True)
The result looks like this:

我们没有看到熵存在差异的证据,我们可以相当肯定 (>99%) 任何此类差异都小于半比特。我们可以得到 die 1 的随机性低于 die 2 的概率,如下所示:
(entropy_die_1 < entropy_die_2).mean()
这给了我们 0.512942:非常接近 0.50,这意味着我们几乎没有证据表明骰子比另一个骰子更随机。
希望对您有所帮助!