Numpy 伯努利随机数发生器

Numpy 伯努利随机数发生器,numpy,statistics,Numpy,Statistics,我无法理解numpy中使用的伯努利随机数生成器是如何计算的,我想对此进行一些解释。例如: np.random.binomial(size=3, n=1, p= 0.5) Results: [1 0 0] n=路径数 p=发生概率 大小=实验数量 如何确定“0”或“1”的生成数/结果 =============================================更新================================== 我创建了一个受限的Boltzmann机器,它总是

我无法理解numpy中使用的伯努利随机数生成器是如何计算的,我想对此进行一些解释。例如:

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

Results:
[1 0 0]
n=路径数

p=发生概率

大小=实验数量

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

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

我创建了一个受限的Boltzmann机器,它总是显示相同的结果,尽管在多次代码执行时是“随机的”。随机化是使用
np.random.seed(10)


一个二元分布的随机变量有两个参数
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
从二项分布计算一次抽签。如果某个整数
k
size=k
,则将计算来自相同二项分布的
k
独立绘图
size
也可以是一个索引数组,在这种情况下,具有给定
size
的整个
np.数组
将由二项分布的独立绘图填充

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

有关二项分布的更多信息,请参见:


我在问算法是如何产生数字的35分钟前的白宫

非技术性解释 如果将
n=1
传递给二项分布,则它相当于伯努利分布。在这种情况下,该功能可以被认为是模拟硬币的投掷
size=3
告诉它将硬币翻转三次,并且
p=0.5
使其成为头部(1)或尾部(0)概率相等的公平硬币

[1 0]
的结果意味着硬币头朝下落下一次,尾巴朝上落下两次。这是随机的,因此再次运行它将导致不同的序列,如
[1 1 0]
[0 1 0]
,甚至可能是
[1 1 1]
。虽然您无法在三次运行中获得相同数量的1和0,但平均而言,您将获得相同数量的1和0

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

  • 如果
    n*p30
    则使用(Kachitvichyanukul和Schmeiser 1988)的BTPE算法。(该出版物是。)

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

我不明白这个问题。请你重新措辞/详细说明一下好吗?@kazemakase当我使用函数
np.random.binomial(size=3,n=1,p=0.5)
我得到了结果
[1 0]
。但是,我不明白numpy是如何得到结果的,我想得到一个解释。你是在问生成数字的算法是如何工作的,还是结果与输入参数有什么关系?我是在问生成数字的算法是如何工作的。随着更新,这实际上是一个新问题。你应该考虑把这个问题作为一个单独的问题,除非你想使现有的答案无效。进一步提示:显示所有相关代码。输出指示迭代,但代码中没有迭代的迹象。看到在同一个上下文中提到的单词seed、iter和相同的结果,我的脑海里响起了一个警报:)(在循环中重新播种?)。因此,请准确地说明您是如何反复调用
二项式
函数的,以及种子植入的确切位置。哦,我明白了,有一刻我认为有一种方法可以准确地确定/计算这些值。实际上,我创建了一个受限玻尔兹曼机器,使用
np.random.binomial
得到的值总是一样的。我已经更新了这个问题,希望你能看看。
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