二项分布(binomial distribution):
P(N)=(nN)pN(1−p)n−N
numpy给出的api是:
numpy.random.RandomState.binomial(n, p, size=None)
表示对一个二项分布进行采样(size表示采样的次数,draw samples from a binomial distribution.),参数中的n, p
分别对应于公式中的
n,p
,函数的返回值表示
n
中成功(success)
的次数(也即
N
)。可能说起来比较抽象,我们以一个具体的实例进行阐释:
说野外正在进行9(
n=9
)口石油勘探井的发掘工作,每一口井能够开发出油的概率是0.1(
p=0.1
)。请问,最终所有的勘探井都勘探失败的概率?
如果手动计算的话,自然简单运用中学概率知识便可秒答,
(nN)pN(1−p)n−N=(90)0.10(1−0.1)9=0.19≈0.3874
,
因为np.random.binomial()
进行的是采样工作,为了逼近这一概率,我们需要进行的是采用统计的方法进行对概率值的逼近。
>>> n, p = 9, .1
>>> sum(np.random.binomial(n, p, size=20000)==0)/20000.
0.38314999999999999
我们继续模拟,两枚硬币都是正面的概率:
>>> n, p = 2, .5
>>> sum(np.random.binomial(n, p, size=20000)==2)/20000.
0.25019999999999998
>>> sum(np.random.binomial(n, p, size=20000)==1)/20000.
0.49430000000000002
>>> n, p = 2, .5
>>> sum(np.random.binomial(n, p, size=20000)==0)/20000.
0.25054999999999999
再比如我们要随机地从
n
个数中以概率
p
对其进行选择,我们可以先生成一个掩膜(mask)
mask = np.random.binomial(1, p, n)
# 也即对这个n个数,分别以p进行确定其值为1(选中该值0),
# 以(1-p)确定其值为0(也即是未选中该值)
在实际中参数
p
也未必一定是一个float类型的纯量,也可以是多个概率值组成的数组,此时需要满足size和p的shape相同,size中的每一个元素依p中的相应位的概率值进行取样,
>>> numpy.random.Random(23455).binomial(size=3, n=1, p=(.2, .8, .99))
array([0, 1, 1])
>>> numpy.random.Random(23455).binomial(size=3, n=1, p=(.2, .8, .99))
array([0, 1, 1])
>>> numpy.random.Random(23455).binomial(size=3, n=1, p=(.2, .8, .99))
array([1, 1, 1])
# 只需记住一点:
# 每一次的概率取值,互相之间是独立的
二项分布进行取样(选中为一,未选中为0)
p(hi=1|v)=σ(ci+Wiv)→p(h=1|v)=σ(c+vTW)p(vj=1|h)=σ(bj+W′jh)→p(v=1|h)=σ(b+hTW′)
def propup(self, vis):
pre_sigmoid_activation = T.dot(vis, self.W)+self.v_bias
return [pre_sigmoid_activation, T.nnet.sigmoid(pre_sigmoid_activation)]
def sample_h_given_x(self, v0_sample):
pre_sigmoid_h1, h1_mean = self.propup(v0_sample)
h1_sample = self.theano_rng.binomial(size=h1_mean, n=1, p=h1_mean, dtype=theano.config.floatX)
return [pre_sigmoid_h1, h1_mean, h1_sample]
二项分布(生成掩码)机制在深度学习算法中的应用
主要是取
n=1
,用来生成MASK(掩码),然后将生成的掩码作用在原始输入上,获得需要的对网络结构的dropout或者对原始输入的corrupted。
比如denoising autoencoder对原始输入的加噪
机制这想法真的很酷,通过学习(特指监督学习)的方式,获得对含噪输入较强的鲁棒结果。
def get_corrupted_input(self, input, corruption_level):
return self.theano_rng.binomial(
size=input.shape, n=1,
p=1-corruption_level,
dtype=theano.config.floatX)*input
再比如避免overfitting的dropout机制(这时屏蔽的是神经网络的部分节点也就是神经元neuron):
def dropout_layer(layer, p_dropout):
mask = theano_rng.binomial(n=1, p=1-p_drop_out, size=layer.shape)
return layer*T.cast(mask, theano.config.floatX)
本文转自[ 点击打开链接 http://blog.csdn.net/lanchunhui/article/details/50172659 ]