二项分布的实现(np.random.binomial)
2015-12-04 11:30
253 查看
二项分布(binomial distribution):
P(N)=(nN)pN(1−p)n−N
numpy给出的api是:
表示对一个二项分布进行采样(size表示采样的次数,draw samples from a binomial distribution.),参数中的
说野外正在进行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,
因为
我们继续模拟,两枚硬币都是正面的概率:
再比如我们要随机地从n个数中以概率p对其进行选择,我们可以先生成一个掩膜(mask)
在实际中参数p也未必一定是一个float类型的纯量,也可以是多个概率值组成的数组,此时需要满足size和p的shape相同,size中的每一个元素依p中的相应位的概率值进行取样,
比如denoising autoencoder对原始输入的
再比如避免overfitting的dropout机制(这时屏蔽的是神经网络的部分节点也就是神经元neuron):
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)
相关文章推荐
- Android编程——自定义View类onSaveInstanceState与onRestoreInstanceState使用方法
- oracle 触发器生成主键的
- Oracle Blob字段转换为String类型
- 基于DFA的敏感词检测和替换模块 SmallGFW
- 成为JavaGC专家(2)—如何监控Java垃圾回收机制
- 转:谈谈对Spring IOC的理解 http://www.cnblogs.com/xdp-gacl/p/4249939.html
- 简单博弈论取石子
- The Swift.org Blog welcome欢迎页note
- MySQL 错误代码
- mysql的1067启动错误的解决
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
- 【python】遍历文件夹
- 如何使用NSError
- Tomcat-----Tomcat6使用三目表达式时解析错误
- beego api生成
- zz: 技术专家!
- Viewpage + fragment 防止预加载
- jQuery 新版本的 Dom 元素动态绑定事件
- ext提交表单的四种方式
- 数据结构实验之查找二:平衡二叉树