【问题标题】:Bernoulli random number generator伯努利随机数发生器
【发布时间】:2018-04-11 06:27:05
【问题描述】:

我不明白 numpy 中使用的伯努利随机数生成器是如何计算的,希望得到一些解释。例如:

np.random.binomial(size=3, n=1, p= 0.5)

Results:
[1 0 0]

n = 路径数

p = 发生概率

大小 = 实验次数

如何确定“0”或“1”的生成数字/结果?

==================================更新============ ======================

我创建了一个受限玻尔兹曼机,尽管它在多次代码执行中是“随机的”,但它始终呈现相同的结果。随机化是使用播种的 np.random.seed(10)

import numpy as np

np.random.seed(10)

def sigmoid(u):
    return 1/(1+np.exp(-u))

def gibbs_vhv(W, hbias, vbias, x):
    f_s = sigmoid(np.dot(x, W) + hbias)
    h_sample = np.random.binomial(size=f_s.shape, n=1, p=f_s)

    f_u = sigmoid(np.dot(h_sample, W.transpose())+vbias)
    v_sample = np.random.binomial(size=f_u.shape, n=1, p=f_u)
    return [f_s, h_sample, f_u, v_sample]

def reconstruction_error(f_u, x):
    cross_entropy = -np.mean(
        np.sum(
            x * np.log(sigmoid(f_u)) + (1 - x) * np.log(1 - sigmoid(f_u)),
            axis=1))
    return cross_entropy


X = np.array([[1, 0, 0, 0]])

#Weight to hidden
W = np.array([[-3.85, 10.14, 1.16],
              [6.69, 2.84, -7.73],
              [1.37, 10.76, -3.98],
              [-6.18, -5.89, 8.29]])

hbias = np.array([1.04, -4.48, 2.50]) #<= 3 bias for 3 neuron in hidden
vbias = np.array([-6.33, -1.68, -1.25, 3.45]) #<= 4 bias for 4 neuron in input


k = 2
v_sample = X
for i in range(k):
    [f_s, h_sample, f_u, v_sample] = gibbs_vhv(W, hbias, vbias, v_sample)
    start = v_sample
    if i < 2:
        print('f_s:', f_s)
        print('h_sample:', h_sample)
        print('f_u:', f_u)
        print('v_sample:', v_sample)
    print(v_sample)
    print('iter:', i, ' h:', h_sample, ' x:', v_sample, ' entropy:%.3f'%reconstruction_error(f_u, v_sample))

结果:

[[1 0 0 0]]
f_s: [[ 0.05678618  0.99652957  0.97491304]]
h_sample: [[0 1 1]]
f_u: [[ 0.99310473  0.00139984  0.99604968  0.99712837]]
v_sample: [[1 0 1 1]]
[[1 0 1 1]]
iter: 0  h: [[0 1 1]]  x: [[1 0 1 1]]  entropy:1.637

f_s: [[  4.90301318e-04   9.99973278e-01   9.99654440e-01]]
h_sample: [[0 1 1]]
f_u: [[ 0.99310473  0.00139984  0.99604968  0.99712837]]
v_sample: [[1 0 1 1]]
[[1 0 1 1]]
iter: 1  h: [[0 1 1]]  x: [[1 0 1 1]]  entropy:1.637

【问题讨论】:

  • 我不明白这个问题。请您改写/详细说明一下吗?
  • @kazemakase 当我使用函数np.random.binomial(size=3, n=1, p= 0.5) 时,我得到了结果[1 0 0]。但是,我不明白 numpy 是如何得到呈现结果的,并希望得到解释。
  • 您是在问生成数字的算法是如何工作的,或者结果与输入参数的关系如何?
  • 我在问算法是如何产生数字的。
  • 随着更新,这实际上是一个新问题。您应该考虑将此作为一个单独的问题提出,除非您想使现有答案无效......进一步提示:显示 all 相关代码。输出指示迭代,但您的代码中没有迭代的迹象。看到在同一上下文中提到的 seed、iter 和 same result 这三个词让我的脑海里响起了警报:)(重新播种在循环?)。因此,请准确说明您是如何重复调用 binomial 函数的,以及播种发生的确切位置。

标签: numpy statistics


【解决方案1】:

我在问算法是如何产生数字的。 – WhiteSolstice 35 分钟前

非技术解释

如果将n=1 传递给二项分布,则它等效于伯努利分布。在这种情况下,该函数可以被认为是模拟硬币翻转。 size=3 告诉它掷硬币 3 次,p=0.5 让它成为一个公平的硬币,head (1) 或 tail (0) 的概率相等。

[1 0 0] 的结果表示硬币落下一次 head 和两次 tail 朝上。这是随机的,因此再次运行它会产生不同的序列,例如[1 1 0]、[0 1 0],甚至可能是[1 1 1]。虽然您无法在 3 次运行中获得相同数量的 1 和 0,但平均而言您将获得相同的数量。

技术说明

Numpy 在 C 中实现随机数生成。二项分布的源代码可以在 here 找到。实际上实现了两种不同的算法。

我认为这两种方法,但肯定是逆变换采样,都依赖于随机数生成器来产生均匀分布的随机数。 Numpy 内部使用Mersenne Twister 伪随机数生成器。然后将均匀随机数转换为所需的分布。

【讨论】:

  • 哦,我明白了,有一段时间我认为有一种方法可以准确地确定/计算这些值。我实际上创建了一个受限玻尔兹曼机,使用np.random.binomial 给出的值始终相同。我已经更新了问题,希望你能看看。
【解决方案2】:

一个二项分布的随机变量有两个参数n和p,可以看成是投掷有偏硬币n次得到正面的次数的分布,其中出现正面的概率每次翻转都是p。 (更正式地说,它是带有参数p 的独立伯努利随机变量的总和。

例如,如果n=10 和p=0.5,可以通过将一枚公平的硬币掷10 次并将硬币正面朝上的次数相加来模拟Bin(10, 0.5) 的平局。

除了上述n 和p 参数之外,np.random.binomial 还有一个额外的size 参数。如果size=1,np.random.binomial 从二项分布中计算一次抽奖。如果size=k 对某个整数k,k 将计算来自相同二项分布的独立抽取。 size 也可以是一个索引数组,在这种情况下,具有给定 size 的整个 np.array 将由二项分布的独立抽取填充。

请注意,二项分布是伯努利分布的推广 - 在 n=1、Bin(n,p) 与 Ber(p) 具有相同分布的情况下。

有关二项式分布的更多信息,请参阅:https://en.wikipedia.org/wiki/Binomial_distribution

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多