给定这个Python代码
success = np.array([1, 2, 3, 4, 5])
failure = np.array([12, 13, 14, 15, 16])
beta_samples = np.random.beta(success + 1, failure + 1, size = 5)
print(beta_samples)
beta_samples2 = [np.random.beta(success[i] + 1, failure[i] + 1) for i in range(5)]
print(beta_samples2)
Python代码的输出是:
[0.22023725 0.18643029 0.14765836 0.12017337 0.39477445]
[0.22605254862542162, 0.12566539444840888, 0.13290508184544317, 0.2718239044172474, 0.1464185003569084]
假设我使用相同的
success
和
failure
数组,为什么我会得到两个完全不同的Beta分布样本?
哪一项是正确的,哪一项是错误的?
这是因为稍后我需要使用
argmax(...)
函数选择这些 beta 样本中最大值的位置/索引,目前,这两个样本都会给我不同的索引/位置。
这两个样本的生成方式不同,导致结果不同。让我们逐行分解代码:
第一种方法:
beta_samples = np.random.beta(success + 1, failure + 1, size = 5)
此行从
同一
Beta 分布中生成 5 个独立样本。此分布的参数由
success + 1
和
failure + 1
确定。这意味着所有 5 个样本都使用相同的 alpha 和 beta 值(基于提供的
success
和
failure
数组)生成。
第二种方法:
beta_samples2 = [np.random.beta(success[i] + 1, failure[i] + 1) for i in range(5)]
此行生成 5 个 Beta 分布样本,但每个样本都来自
不同的
分布。循环遍历
success
和
failure
数组中的每个对应对,并使用这些特定值生成一个样本。因此,最终会得到 5 个来自具有不同 alpha 和 beta 值的不同 Beta 分布的样本。
哪个是正确的?
两者都是正确的,具体取决于的目标。
-
如果想要从
单个
Beta 分布中抽取多个样本(使用提供的
success
和failure
数据定义),则第一种方法是正确的。 -
如果想要从
多个
Beta 分布中抽取样本(其中每个分布由
success
和failure
数组中的对应对定义),则第二种方法是正确的。
argmax 问题:
获得不同的 argmax 结果是因为从不同的分布中抽取了样本。由于每个样本集都代表来自不同基础分布的随机抽样,因此它们具有不同的值并导致不同的 argmax 索引也就不足为奇了。
要使用哪种方法?
要确定要使用哪种方法,请考虑的目标是什么:
- 如果希望获得特定 Beta 分布(由所有成功和失败的汇总定义)的代表性样本,请使用第一种方法。
- 如果希望从多个 Beta 分布(每个都代表不同的成功/失败对)中获得样本,请使用第二种方法。
一旦选择了正确的方法,
argmax
函数将为提供基于该方法生成的样本的正确最大值索引。请记住,即使使用同一种方法,由于随机性,也可能会在每次运行代码时获得不同的 argmax 结果。