二项分布(binomial distribution):

P(N)=(nN)pN(1−p)n−N

P(N)=\begin{pmatrix}n\\N \end{pmatrix}p^N(1-p)^{n-N}
numpy给出的api是:

numpy.random.RandomState.binomial(n, p, size=None)

表示对一个二项分布进行采样(size表示采样的次数,draw samples from a binomial distribution.),参数中的n, p分别对应于公式中的n,pn,p,函数的返回值表示nn中成功(success)的次数(也即NN)。可能说起来比较抽象,我们以一个具体的实例进行阐释:

说野外正在进行9(n=9n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是0.1(p=0.1p=0.1)。请问,最终所有的勘探井都勘探失败的概率?

如果手动计算的话,自然简单运用中学概率知识便可秒答,(nN)pN(1−p)n−N=(90)0.10(1−0.1)9=0.19≈0.3874\begin{pmatrix}n\\N\end{pmatrix}p^N(1-p)^{n-N}=\begin{pmatrix}9\\0\end{pmatrix}0.1^0(1-0.1)^9=0.1^9\approx0.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

再比如我们要随机地从nn个数中以概率pp对其进行选择,我们可以先生成一个掩膜(mask)

mask = np.random.binomial(1, p, n)# 也即对这个n个数,分别以p进行确定其值为1(选中该值0),# 以(1-p)确定其值为0(也即是未选中该值)

在实际中参数pp也未必一定是一个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′)

\begin{split} &p(h_i=1|v)=\sigma(c_i+W_iv)\rightarrow p(\mathbf{h}=1|\mathbf{v})=\sigma(\mathbf{c}+\mathbf{v}^T\mathbf{W})\\ &p(v_j=1|h)=\sigma(b_j+W'_jh)\rightarrow p(\mathbf{v}=1|\mathbf{h})=\sigma(\mathbf{b}+\mathbf{h}^T\mathbf{W'}) \end{split}

def propup(self, vis):pre_sigmoid_activation = T.dot(vis, self.W)+self.v_biasreturn [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=1n=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)

二项分布的实现(np.random.binomial)相关推荐

  1. 二项分布(np.random.binomial),搞它就完了

    二项分布(np.random.binomial),搞它就完了! 首先我们的搞清楚伯努利分布和二项分布,我们先找个例子,选西瓜,待我细细道来. 伯努利分布 选一个西瓜,选到好瓜的概率为,选到坏瓜的概率为 ...

  2. 大数据分析工具作业task01:np.random总结及几种常见概率分布图形的绘制

    numpy.random在生成大型样本时比纯python方式快了一个数量级 写这篇文章的原因是小米菲一直对于numpy中的伪随机数们傻傻分不清楚,再加上我的大数据分析工具老师让我们画出六种分布的图形( ...

  3. np.random的各种不同用法

    随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值(随机值位于0~1之间 >>> np.random.rand(3,2) ar ...

  4. np.random.permutation

    np.random.permutation np.random.permutation():随机排列序列. 例1:对0-5之间的序列进行随机排序 例2:对一个list进行随机排序 多维度的咋回事? 来 ...

  5. np.random.randint 与 np.random.rand区别 前者返回为参数指定的范围区间的一个整数后者返回的为一个概率

    np.random.randint  与 np.random.rand区别 前者返回为参数指定的范围区间的一个整数后者返回的为一个概率 import numpy as np num_lstm = np ...

  6. (如何从一个列表中随机抽样)np.random.choice(),random.sample()

    文章目录 前言 numpy random.sample() 前言 个人觉得np.random.choice()功能更加强大,random.sample()可以做到的,前者都可以做到. numpy 这个 ...

  7. #np.random.normal,产生制定分布的数集(默认是标准正态分布)

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html #np.random.normal,产生制定分 ...

  8. np.random.seed用法

    参考https://stackoverflow.com/questions/21494489/what-does-numpy-random-seed0-do random.seed是随机种子生成器,当 ...

  9. Numpy:利用Numpy库建立可视化输入的二次函数数据点集np.linspace+np.random.shuffle+np.random.normal

    Numpy:利用Numpy库建立可视化输入的二次函数数据点集np.linspace+np.random.shuffle+np.random.normal 目录 输出结果 代码设计 输出结果 代码设计 ...

最新文章

  1. webService初探
  2. 算法(伪代码)的书写
  3. P2782 友好城市
  4. java虚拟机的内存模型_JVM(Java虚拟机)内存模型(转载/整理)
  5. python 数据分析 书籍推荐 知乎_Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!...
  6. Windows应用程序启动命令汇总
  7. mac下安装前端模板引擎Jinja2
  8. python列表元素都加倍_关于python列表增加元素的三种操作方法
  9. 支付宝支付系统繁忙,请稍后再试(ALI64)错误解决
  10. leetcode题解25-K个一组翻转链表
  11. 卸载VS2005不完全出现的安装问题
  12. 3.2制作双绞线跳线
  13. 酒店管理系统-需求分析报告
  14. 2018蓝桥杯模拟赛(一)--青出于蓝而胜于蓝(线段树)
  15. 使用二维码——第三方库ZBar和libqrencode的使用
  16. 眼球追踪技术是VR下一个突破口?
  17. C语言关系运算符详解
  18. 软件工程——软件测试方法
  19. Android Multimedia Framework overview(多媒体框架概述)--base on jellybean(一)
  20. [刷题]leetcode\704_二分查找

热门文章

  1. linux salt命令 -e,Linux记录-salt命令
  2. db2 查看属性的数据类型 小数位 null约束
  3. webbench 压力测试软件
  4. 【OCR一】字符识别技术总览(转)
  5. OpenCV使用FileStorage保存Mat数据
  6. maven项目转换为web项目
  7. Android开发之万能适配器
  8. UVA1394 LA3882 POJ3517 And Then There Was One【约瑟夫环+数学】
  9. 欢迎使用CSDN-markdown编辑器--样例
  10. JSK-15 单独的数字【位运算】