伯努利随机数生成器

时间:2017-10-30 10:00:35

标签: numpy statistics

我无法理解如何计算numpy中使用的伯努利随机数发生器,并希望对其进行一些解释。例如:

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

Results:
[1 0 0]

n =路径数

p =发生概率

尺寸=实验次数

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

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

我创建了一个Restricted Boltzmann机器,尽管它是随机的,但它总能呈现相同的结果。多个代码执行。随机化使用。播种 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

2 个答案:

答案 0 :(得分:1)

二项分布随机变量有两个参数np,可以认为是在翻转有偏见的硬币n次时获得的头数分布,其中在每次翻转时获得头部的概率为p。 (更正式地说,它是具有参数p)的独立伯努利随机变量的总和。

例如,如果n=10p=0.5,可以通过翻转一枚公平的硬币10次并总结硬币落地的次数来模拟Bin(10, 0.5)的平局。 / p>

除了上述np参数外,np.random.binomial还有一个size参数。如果size=1,则np.random.binomial计算二项分布中的单个绘图。如果某个整数size=kk,则会计算来自相同二项分布的k个独立抽取。 size也可以是索引数组,在这种情况下,具有给定np.array的整个size将使用二项分布中的独立绘制进行填充。

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

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

答案 1 :(得分:1)

  

我在问这个算法如何产生数字。 - WhiteSolstice 35分钟前

非技术性解释

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

[1 0 0]的结果意味着硬币在 head 下降了一次,而 tail 面朝上两次。这是随机的,因此再次运行会产生不同的序列,例如[1 1 0][0 1 0],甚至可能[1 1 1]。虽然在三次运行中你不能得到相同数量的1和0,但平均你会得到相同的数字。

技术说明

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

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