numpy.random在生成大型样本时比纯python方式快了一个数量级

写这篇文章的原因是小米菲一直对于numpy中的伪随机数们傻傻分不清楚,再加上我的大数据分析工具老师让我们画出六种分布的图形(包括正态、指数、均匀;0-1、二项、泊松。)所以趁着这个机会恶补一下,顺便学学常用的统计图形怎么画。

一个目录

  • 1.函数总结
  • 2.均匀分布
    • 2.1均匀分布np.random.rand()
    • 2.2 均匀分布的图像绘制
    • 2.3 补充——直方图hist()参数bins变量类型
  • 3. 正态分布(高斯分布)
    • 3.1 np.random.normal()
    • 3.2 正态分布的图形绘制
  • 4.二项分布
    • 4.1 np.random.binomial()
    • 4.2二项分布的介绍
    • 4.3 二项分布的图形绘制
  • 5.泊松分布
    • 5.1numpy.random.poisson(lam=1.0, size=None)
    • 5.2 泊松分布介绍
  • 6. 指数分布
    • 6.1 np.random.exponential(scale=1.0, size=None)
    • 6.2 指数分布介绍
    • 6.2指数分布图形绘制
  • References:

1.函数总结

首先来看看np.random这个神奇的模块里都有什么东西~

函数 描述
seed 向随机数生成器传递随机状态种子
permutation 返回一个序列的随机排列,或者返回一个乱序的整数范围排列
shuffle 随机排列一个序列
rand 从均匀分布中抽取样本
randint 根据给定的由低到高的范围抽取随机整数
randn 从均值0方差1的正态分布中抽取样本(MATLAB)型接口
binomial 从二项分布中抽取样本
normal 从正态(高斯)分布中抽取样本
beta 从beta分布中抽取样本
chisquare 从卡方分布中抽取样本
gamma 从伽马分布中抽取样本
uniform 从均匀[0,1)分布中抽取样本

2.均匀分布

2.1均匀分布np.random.rand()

np.random.randn(d0,d1,d2……dn)

numpy.random.rand(d0, d1, …, dn)的随机样本位于[0,
1)中:本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。

当括号内不指定数组维度时,只返回一个随机数。

import numpy as np
np.random.rand()
#输出:0.20681767259571593(仅供参考,每次输出的结果不一样)

当不断执行上面的代码时,每次输出的伪随机数是不一样的,之所以称之为伪随机数,是因为它们是由具有确定性行为的算法根据随机数生成器中的随机数种子生成的。可以自己设定seed括号内的数字来确保每次运行的结果相同。

import numpy as np
np.random.seed(10)
np.random.rand()
#输出:0.771320643266746(每次输出的结果被确定了)

指定一个数时,返回一维数组,数组长度为所指定的数字。

import numpy as np
np.random.rand(10)
#输出:
#array([0.91349005, 0.44452064, 0.83148614, 0.71111884, 0.2050335 ,0.96147339, 0.77422567, 0.14801064, 0.44593339, 0.45938472])

当然了,还可以生成二维、三维、…甚至更高维的数组。下面来看一个2×3的二维数组 ,同时,我们来比较一下1×6的数组和其有什么不同,在这里我们设置一个随机数种子10:

np.random.seed(10)
np.random.rand(2,3)
#array([[0.77132064, 0.02075195, 0.63364823], [0.74880388, 0.49850701, 0.22479665]])
np.random.seed(10)
np.random.rand(6)
#array([0.77132064, 0.02075195, 0.63364823, 0.74880388, 0.49850701,0.22479665])

看到了吗,输出结果除了维数之外没有什么不同。

2.2 均匀分布的图像绘制

import matplotlib.pyplot as plt
np.random.seed(5)
x = np.random.rand(1000000)
t = np.arange(len(x))
plt.hist(x, bins = 30, color='m', alpha=0.5, label=u'均匀分布', normed=True)
plt.show()


可以看到,因为np.random.rand()生成的是[0,1)上的均匀分布,所以当样本量足够大时,直方图上各个数据点的数字近乎于等频率出现,这符合我们对于均匀分布的认知。

当我们把bins设置成1000时,图形出现了细微的变化,但是大体上仍然符合我们对均匀分布的认知。

2.3 补充——直方图hist()参数bins变量类型

这里我不太懂,所以引用了一下别人的。
参考:bins变量类型

bins : integer or array_like, optional

一、integer(整型)

表示直方个数,或区间等分份数。

二、array_like(类数组?)

这个类型是类数组吗?可以使用np.array类型。

array里的每个元素,相当于自定义区间端点。

大概的意思bins在传入整型时能够代表区间等分的份数,像我们在2.2中画出的bins=30的直方图和bins = 1000的直方图就很明显能感觉到bin(箱子)的个数不同。

感觉这种思想类似于我们自己手画直方图时候对于区间的分组,因为我们不太可能把每个数组都用直方bin表现一遍,这样对于统计的图形展示也没什么意义,因此我们需要设置bins的个数,bins越大,区间就分的越细。

3. 正态分布(高斯分布)

3.1 np.random.normal()

正态分布概率密度公式如下:

numpy中,这个函数的参数如下:

numpy.random.normal(loc=0.0, scale=1.0, size=None)

loc:float
  概率分布的均值,对应着整个分布的中心center

scale:float
  概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高

size:int or tuple of ints

输出的shape,默认为None,只输出一个值

这里可以注意到我们在之前提到的另外一个函数np.random.randn(),这表示从均值为0方差为1的正态分布(也就是标准正态分布)中抽取样本。其实就相当于:np.random.normal(loc=0, scale=1, size)

3.2 正态分布的图形绘制

标准正态分布的直方图绘制,我们在这里规定了均值为0,方差为1.

import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(loc = 0,scale = 1,size = 100000)
plt.hist(x,bins = 100,color = 'b',alpha = 0.2)


标准正态分布的概率密度函数图形绘制如下:

#标准正态分布的概率密度图像
mu = 0
sigma =1
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 50)
y = np.exp(-(x-mu)**2/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))
plt.plot(x,y)
plt.title('正态分布概率密度图: $\mu = 0$, $\sigma=1$')
#Probability density diagram of normal distribution
plt.show()


这里我对于x的区间所用的linspace还不是很熟悉,后面我会专门写一篇来介绍。

或者使用scipy库中的stats模块来绘制正态分布的概率密度,更加方便:

from scipy import stats
x = np.arange(-5, 5, 0.1)
y = stats.norm.pdf(x, loc=0.0, scale=1.0)
plt.plot(x,y)

4.二项分布

4.1 np.random.binomial()

二项分布的介绍见4.2.
总之,表示在n次试验中,有多少试验是成功的,k可以一直从0取到n。

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

其中,n表示n次试验,p表示试验成功的概率(也就是事件A发生的概率)。
我们写一个二项分布的随机数代码如下:

a = np.random.binomial(100,0.2,size=10000)

其中,100表示做了100次试验,0.2表示试验成功的概率。size = 10000表示重复采样10000次,因为基于概率,以100次试验为一组,重复做多组试验之后成功的个数不一定一样。

a
#array([24, 18, 18, ..., 21, 17, 20])
len(a)
#10000

可以注意到,函数的返回值是一个大小为10000的数组,数组中的数字差别不算很大,表示每次采样(每次采样时都会做n次试验,在这里n=100)时n中成功(success)的次数,也就是我们所说的X~B(n,p)中的X。

不难发现,X,也就是数组中的元素,是接近于这个二项分布的期望np的。

4.2二项分布的介绍

什么是伯努利试验?
伯努利试验(Bernoulli experiment)是在同样的条件下重复地、相互独立地进行的一种随机试验,其特点是该随机试验只有两种可能结果:发生或者不发生。我们假设该项试验独立重复地进行了n次,那么就称这一系列重复独立的随机试验为n重伯努利试验,或称为伯努利概型。单个伯努利试验是没有多大意义的,然而,当我们反复进行伯努利试验,去观察这些试验有多少是成功的,多少是失败的,事情就变得有意义了,这些累计记录包含了很多潜在的非常有用的信息。
什么是二项分布?
在n次独立重复的伯努利试验中,设每次试验中事件A发生的概率为p。用X表示n重伯努利试验中事件A发生的次数,则X的可能取值为0,1,…,n,且对每一个k(0≤k≤n),事件{X=k}即为“n次试验中事件A恰好发生k次”,随机变量X的离散概率分布即为二项分布(Binomial Distribution)。
伯努利分布和二项分布的关系
伯努利分布也就是我们常说的0-1分布或两点分布,试验结果只有两个,发生或不发生。当n=1时,二项分布就变成了伯努利分布也就是0-1分布。
二项分布的概率分布公式如下:

4.3 二项分布的图形绘制

直方图绘制:
当仅仅做了100次采样时,绘制出的直方图如下:

a = np.random.binomial(100,0.2,size=100)
a
plt.hist(a,bins = 100,color = 'r',alpha = 0.3)


当做了10000次采样时,直方图的绘制如下:

a = np.random.binomial(100,0.2,size=10000)
a
plt.hist(a,bins = 100,color = 'r',alpha = 0.3)

5.泊松分布

5.1numpy.random.poisson(lam=1.0, size=None)

x = np.random.poisson(lam=2, size=100000000)```
plt.hist(x,bins = 100,color = 'm',alpha = 0.5)

x = np.random.poisson(lam=10, size=100000000)```
plt.hist(x,bins = 100,color = 'm',alpha = 0.5)

x = np.random.poisson(lam=100, size=100000000)
plt.hist(x,bins = 200,color = 'm',alpha = 0.5)

不难看出,当lam越来越大时,泊松分布越来越接近于正态分布。

5.2 泊松分布介绍

Poisson分布,是一种统计与概率学里常见到的离散概率分布,由法国数学家西莫恩·德尼·泊松(Siméon-Denis Poisson)在1838年时发表。
泊松分布的分布律如下:

泊松分布的参数λ是单位时间(或单位面积)内随机事件的平均发生次数。而且一般是小概率事件,比如机器出现的故障数,自然灾害发生的次数,一块产品上的缺陷数等。
当二项分布的n很大而p很小时,泊松分布可以作为二项分布的近似,其中λ = np.

泊松分布的期望和方差都是λ。

6. 指数分布

6.1 np.random.exponential(scale=1.0, size=None)

这里的scale是β,而β=1/λ.
返回的numpy数组是得到的满足指数分布的随机样本。

6.2 指数分布介绍

指数分布的概率密度函数如下:

6.2指数分布图形绘制

利用numpy中的random先生成符合指数分布的随机数,再用直方图函数绘制方法去绘制,图形接近于指数分布概率密度函数图形。

x = np.random.exponential(scale=0.3, size=100000)
plt.hist(x,bins = 1000)


指数函数概率密度图形:

lam = 3
x  = np.linspace(0,3.5,num = 100000)
y = lam*np.exp(-lam*x)
plt.plot(x,y,'-')

因为上面的scale = 0.3≈1/3,所以绘制密度函数时我们可以设置λ = 3.

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
#解决后续绘图中文显示不出来的问题
lam = 3
x  = np.linspace(0,3.5,num = 100000)
y = lam*np.exp(-lam*x)
plt.plot(x,y,'-')
plt.title("指数函数概率密度图像")

这里用到了一个np.linspace函数,其实和np.arange()类似,但是arange设置的是步长,而这个函数用于生成区间范围内的指定个数的数字。比如np.linspace(0,3.5,num = 100000) 就是生成0-3.5之间的数字,共100000个。(注意,是闭区间)

References:

1.《利用python进行数据分析》(原书第二版)
2.python绘图之均匀分布
3.np,random.normal()正态分布
4.常见概率分布的Matlplotlib实现
5.Scipy——入门篇
6.吴赣昌 主编.概率论与数理统计理工类 第5版:中国人民大学出版社,2017
7.伯努利试验——百度百科
8.np.random.binomial()
9.重点看:二项分布(np.random.binomial)

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

  1. 大数据分析处理框架——离线分析(hive,pig,spark)、近似实时分析(Impala)和实时分析(storm、spark streaming)...

    大数据分析处理架构图 数据源: 除该种方法之外,还可以分为离线数据.近似实时数据和实时数据.按照图中的分类其实就是说明了数据存储的结构,而特别要说的是流数据,它的核心就是数据的连续性和快速分析性: 计 ...

  2. 工业大数据分析综述:模型与算法

    工业大数据分析综述:模型与算法 王宏志,梁志宇,李建中,高宏 哈尔滨工业大学计算机科学与技术学院,黑龙江 哈尔滨 150001   摘要:随着条形码.二维码.RFID.工业传感器.自动控制系统.工业互 ...

  3. 【干货】剖析大数据分析方法论的几种理论模型(文末有福利哦)

    做 大数据分析 的三大作用,主要是:现状分析.原因分析和 预测分析 .什么时候开展什么样的数据分析,需要根据我们的需求和目的来确定. 利用大数据分析的应用案例更加细化的说明做大数据分析方法中经常用到的 ...

  4. [数据分析方法论]剖析大数据分析方法论的几种理论模型

    剖析大数据分析方法论的几种理论模型 做大数据分析的三大作用,主要是:现状分析.原因分析和预测分析.什么时候开展什么样的数据分析,需要根据我们的需求和目的来确定. 利用大数据分析的应用案例更加细化的说明 ...

  5. 数据分析之np.random.choice()补充【从二维数组随机选择n行一维数组】

    相关参数 size:从元组,列表,数组中取多少个数据,不写,默认为1个 replace:是否可以取相同元素:True:可以,False:不可以,默认是True p:实际是个数组,大小与数组相同,用来规 ...

  6. 大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证

    第一部分已经写到这里了,看完第一部分再看这一部分:大数据分析实战-信用卡欺诈检测 文章目录 下采样方案 交叉验证 下采样方案 下采样方案的实现过程比较简单,只需要对正常样本进行采样,得到与异常样本一样 ...

  7. python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...

    智慧树知到大数据分析的python基础答案 在派生类中可以通过 " 基类名 . 方法名 ()" 的方式来调用基类中的方法 . 下面代码的执行结果是 : ( ) a = 10.99 ...

  8. [Pyhon大数据分析] 五.人民网新闻话题抓取及Gephi构建主题知识图谱

    该系列文章是Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图显示.情感分析.舆情分析.主题挖掘.威胁情报溯源.知识图谱.预测预警及AI和NLP应用等.希望该系列文章对您有所帮助. ...

  9. 基于大数据分析的葡萄酒品质鉴别系统设计与实现

    温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目背景 葡萄酒品鉴既是一门科学,也是一门艺术.品鉴葡萄酒,首先当然要能鉴别酸.甜.苦.咸.鲜五种基本味道,它 ...

最新文章

  1. Java实现敏感词过滤 - IKAnalyzer中文分词工具
  2. 离散数学反对称关系_【离散数学】1.2&1.3集合与元素,集合与集合之间的关系...
  3. teamcity_TeamCity工件:HTTP,Ant,Gradle和Maven
  4. 带彩色字体的man pages(debian centos)
  5. java性能优化方案_Java性能优化要点
  6. flog和flag_FLAG:写作,英语和持续学习
  7. 第94课 函数的参数 《小学生C++编程入门》 例94.1
  8. 电商美工中秋节电商淘宝页面设计模板素材,临摹参考框架
  9. arcgis导出shp文件_RegionManager GIS导出shp文件编码说明
  10. c语言生成1 100随机数求和,c语言 产生1~100随机数,输入一个数字,和第x个随机数一致的话,计算1~x个随机数的和...
  11. java ee jsp程序_JavaEE程序设计及项目开发教程(JSP篇)
  12. 国际网页短信平台通道源码搭建软件后台定制-移讯云短信系统
  13. 彩虹易支付全开源码全新完全开源无任何加密易支付程序
  14. 2013-06-16 读书笔记 大前研一 《无国界的世界》
  15. 故障树手册(Fault Tree handbook)(6)
  16. html p标签嵌套a,HTML标签嵌套规则详细归纳适合新手朋友
  17. 如何使用WiFi的WPS功能
  18. 偏门赚钱日赚1000,这个创业项目我本来不想说的....
  19. php fatal error: cannot redeclare,Fatal error: Cannot redeclare 常见问题
  20. MOSS 学习的比较好的网

热门文章

  1. 第四次画心形流水灯,并且选封装
  2. 【vite+vue3】vite代理 | 同源策略 | Access to XMLHttpRequest at | CORS || Access-Control-Allow-Origin
  3. 11.29 电驴设置对话框形式的实现中遇到的问题
  4. jav1.8 Stream详解
  5. 《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
  6. 物联网操作系统HelloX已成功移植到MinnowBoard MAX开发板上
  7. Spring面试题之循环依赖与三级缓存
  8. IntelliJ IDEA 卡成了球?
  9. 创建同义词文本维护同义词
  10. baidu touch.js在某些机子(Motorola XT531)上旋转不动