Numpy入门教程:07. 随机抽样
背景
什么是 NumPy 呢?
NumPy 这个词来源于两个单词 – Numerical
和Python
。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景:
- 执行各种数学任务,如:数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于 Python 的 MATLAB 的快速替代。
- 计算机中的图像表示为多维数字数组。NumPy 提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
- 在编写机器学习算法时,需要对矩阵进行各种数值计算。如:矩阵乘法、求逆、换位、加法等。NumPy 数组用于存储训练数据和机器学习模型的参数。
随机抽样
numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。
numpy.random.seed(seed=None)
Seed the generator.
seed()
用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()
值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。
离散型随机变量
二项分布
numpy.random.binomial(n, p, size=None)
Draw samples from a binomial distribution.
表示对一个二项分布进行采样,size
表示采样的次数,n
表示做了n
重伯努利试验,p
表示成功的概率,函数的返回值表示n
中成功的次数。
【例】野外正在进行9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是0.1(p=0.1)。请问,最终所有的勘探井都勘探失败的概率?
import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20200605)
n = 9
p = 0.1
size = 50000
x = np.random.binomial(n, p, size)
print(np.sum(x == 0) / size) # 0.3897plt.hist(x)
plt.show()s = stats.binom.pmf(range(10), n, p)
print(np.around(s, 3))
# [0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]
【例】模拟投硬币,投2次,请问两次都为正面的概率?
import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20200605)
n = 2
p = 0.5
size = 50000
x = np.random.binomial(n, p, size)
print(np.sum(x == 0) / size) # 0.25154
print(np.sum(x == 1) / size) # 0.49874
print(np.sum(x == 2) / size) # 0.24972plt.hist(x, density=True)
plt.show()s = stats.binom.pmf(range(n + 1), n, p)
print(np.around(s, 3))
# [0.25 0.5 0.25]
泊松分布
numpy.random.poisson(lam=1.0, size=None)
Draw samples from a Poisson distribution.
表示对一个泊松分布进行采样,size
表示采样的次数,lam
表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。
【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?
import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20200605)
lam = 42 / 6
size = 50000
x = np.random.poisson(lam, size)
print(np.sum(x == 6) / size) # 0.14988plt.hist(x)
plt.show()x = stats.poisson.pmf(6, lam)
print(x) # 0.14900277967433773
超几何分布
numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
Draw samples from a Hypergeometric distribution.
表示对一个超几何分布进行采样,size
表示采样的次数,ngood
表示总体中具有成功标志的元素个数,nbad
表示总体中不具有成功标志的元素个数,ngood+nbad
表示总体样本容量,nsample
表示抽取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取nsample
个元素中具有成功标识的元素个数。
【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
import numpy as np
from scipy import stats
import matplotlib.pyplot as pltnp.random.seed(20200605)
size = 500000
x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)
print(np.sum(x == 3) / size) # 0.198664plt.hist(x, bins=8)
plt.show()"""
M 为总体容量
n 为总体中具有成功标志的元素的个数
N,k 表示抽取N个元素有k个是成功元素
"""
x = range(8)
s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12)
print(np.round(s, 3))
# [0. 0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]
连续型随机变量
均匀分布
numpy.random.uniform(low=0.0, high=1.0, size=None)
Draw samples from a uniform distribution.
Samples are uniformly distributed over the half-open interval [low, high)
(includes low, but excludes high). In other words, any value within the given interval is equally likely to be drawn by uniform
.
【例】在low到high范围内,创建大小为size的均匀分布的随机数。
import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20200614)
a = 0
b = 100
size = 50000
x = np.random.uniform(a, b, size=size)
print(np.all(x >= 0)) # True
print(np.all(x < 100)) # True
y = (np.sum(x < 50) - np.sum(x < 10)) / size
print(y) # 0.40144plt.hist(x, bins=20)
plt.show()a = stats.uniform.cdf(10, 0, 100)
b = stats.uniform.cdf(50, 0, 100)
print(b - a) # 0.4
作为uniform()
的特列,可以得到[0,1)
之间的均匀分布的随机数。
numpy.random.rand(d0, d1, ..., dn)
Random values in a given shape.
Create an array of the given shape and populate it with random samples from a uniform distribution over [0, 1)
.
【例】根据指定大小产生[0,1)之间均匀分布的随机数。
import numpy as npnp.random.seed(20200614)
print(np.random.rand())
# 0.7594819171852776print(np.random.rand(5))
# [0.75165827 0.16552651 0.0538581 0.46671446 0.89076925]print(np.random.rand(4, 3))
# [[0.10073292 0.14624784 0.40273923]
# [0.21844459 0.22226682 0.37246217]
# [0.50334257 0.01714939 0.47780388]
# [0.08755349 0.86500477 0.70566398]]np.random.seed(20200614)
print(np.random.uniform()) # 0.7594819171852776
print(np.random.uniform(size=5))
# [0.75165827 0.16552651 0.0538581 0.46671446 0.89076925]print(np.random.uniform(size=(4, 3)))
# [[0.10073292 0.14624784 0.40273923]
# [0.21844459 0.22226682 0.37246217]
# [0.50334257 0.01714939 0.47780388]
# [0.08755349 0.86500477 0.70566398]]
作为uniform
的另一特例,可以得到[low,high)
之间均匀分布的随机整数。
numpy.random.randint(low, high=None, size=None, dtype='l')
Return random integers fromlow
(inclusive) tohigh
(exclusive).
Return random integers from the “discrete uniform” distribution of the specified dtype in the “half-open” interval [low, high). If high is None (the default), then results are from [0, low).
【例】若high
不为None
时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
import numpy as npnp.random.seed(20200614)
x = np.random.randint(2, size=10)
print(x)
# [0 0 0 1 0 1 0 0 0 0]x = np.random.randint(1, size=10)
print(x)
# [0 0 0 0 0 0 0 0 0 0]x = np.random.randint(5, size=(2, 4))
print(x)
# [[3 3 0 1]
# [1 1 0 1]]x = np.random.randint(1, 10, [3, 4])
print(x)
# [[2 1 7 7]
# [7 2 4 6]
# [8 7 2 8]]
正态分布
numpy.random.randn(d0, d1, ..., dn)
Return a sample (or samples) from the “standard normal” distribution.
【例】根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20200614)
size = 50000
x = np.random.randn(size)
y1 = (np.sum(x < 1) - np.sum(x < -1)) / size
y2 = (np.sum(x < 2) - np.sum(x < -2)) / size
y3 = (np.sum(x < 3) - np.sum(x < -3)) / size
print(y1) # 0.68596
print(y2) # 0.95456
print(y3) # 0.99744plt.hist(x, bins=20)
plt.show()y1 = stats.norm.cdf(1) - stats.norm.cdf(-1)
y2 = stats.norm.cdf(2) - stats.norm.cdf(-2)
y3 = stats.norm.cdf(3) - stats.norm.cdf(-3)
print(y1) # 0.6826894921370859
print(y2) # 0.9544997361036416
print(y3) # 0.9973002039367398
还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
Draw random samples from a normal (Gaussian) distribution.
normal()
为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
sigma * np.random.randn(...) + mu
【例】
import numpy as np
import matplotlib.pyplot as pltnp.random.seed(20200614)
x = 0.5 * np.random.randn(2, 4) + 5
print(x)
# [[5.39654234 5.4088702 5.49104652 4.95817289]
# [4.31977933 4.76502391 4.70720327 4.36239023]]np.random.seed(20200614)
mu = 5
sigma = 0.5
x = np.random.normal(mu, sigma, (2, 4))
print(x)
# [[5.39654234 5.4088702 5.49104652 4.95817289]
# [4.31977933 4.76502391 4.70720327 4.36239023]]size = 50000
x = np.random.normal(mu, sigma, size)print(np.mean(x)) # 4.996403463175092
print(np.std(x, ddof=1)) # 0.4986846716715106plt.hist(x, bins=20)
plt.show()
指数分布
numpy.random.exponential(scale=1.0, size=None)
Draw samples from an exponential distribution.
【例】scale = 1/lambda
import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20200614)
lam = 7
size = 50000
x = np.random.exponential(1 / lam, size)
y1 = (np.sum(x < 1 / 7)) / size
y2 = (np.sum(x < 2 / 7)) / size
y3 = (np.sum(x < 3 / 7)) / size
print(y1) # 0.63218
print(y2) # 0.86518
print(y3) # 0.95056plt.hist(x, bins=20)
plt.show()y1 = stats.expon.cdf(1 / 7, scale=1 / lam)
y2 = stats.expon.cdf(2 / 7, scale=1 / lam)
y3 = stats.expon.cdf(3 / 7, scale=1 / lam)
print(y1) # 0.6321205588285577
print(y2) # 0.8646647167633873
print(y3) # 0.950212931632136
其它随机函数
numpy.random.choice(a, size=None, replace=True, p=None)
Generates a random sample from a given 1-D array.
从序列中获取元素,若a
为整数,元素取值从np.range(a)
中随机获取;若a
为数组,取值从a
数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复replace
,以及选取元素的概率p
。
【例】
import numpy as npnp.random.seed(20200614)
x = np.random.choice(10, 3)
print(x) # [2 0 1]x = np.random.choice(10, 3, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
print(x) # [3 2 3]x = np.random.choice(10, 3, replace=False, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])
print(x) # [3 0 2]aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']
x = np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])
print(x) # ['pooh' 'rabbit' 'pooh' 'pooh' 'pooh']np.random.seed(20200614)
x = np.random.randint(0, 10, 3)
print(x) # [2 0 1]
数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。
numpy.random.shuffle(x)
Modify a sequence in-place by shuffling its contents.
This function only shuffles the array along the first axis of a
multi-dimensional array. The order of sub-arrays is changed but
their contents remains the same.
对x
进行重排序,如果x
为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。
【例】洗牌,改变自身内容,打乱顺序。
import numpy as npnp.random.seed(20200614)
x = np.arange(10)
np.random.shuffle(x)
print(x)
# [6 8 7 5 3 9 1 4 0 2]print(np.random.shuffle([1, 4, 9, 12, 15]))
# Nonex = np.arange(20).reshape((5, 4))
print(x)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [12 13 14 15]
# [16 17 18 19]]np.random.shuffle(x)
print(x)
# [[ 4 5 6 7]
# [ 0 1 2 3]
# [ 8 9 10 11]
# [16 17 18 19]
# [12 13 14 15]]
numpy.random.permutation(x)
Randomly permute a sequence, or return a permuted range.
If x
is a multi-dimensional array, it is only shuffled along its first index.
permutation()
函数的作用与shuffle()
函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。
【例】
import numpy as npnp.random.seed(20200614)
x = np.arange(10)
y = np.random.permutation(x)
print(y)
# [6 8 7 5 3 9 1 4 0 2]print(np.random.permutation([1, 4, 9, 12, 15]))
# [ 4 1 9 15 12]x = np.arange(20).reshape((5, 4))
print(x)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [12 13 14 15]
# [16 17 18 19]]y = np.random.permutation(x)
print(y)
# [[ 8 9 10 11]
# [ 0 1 2 3]
# [12 13 14 15]
# [16 17 18 19]
# [ 4 5 6 7]]
参考文献
- https://www.jianshu.com/p/63434ad5ea64
当前活动
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
相关文章:

如何成为一个Android高手
很多Android开发者已经度过了初级、中级,如何成为一个Android高手呢? eoeAndroid就各个级别的程序员应该掌握哪些内容作为下面分类. 一、初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android U…

云终端处理器——Atom
由于上周展会的缘故,开始对云终端【I】处理器产生兴趣,接下来在“物理层”【II】来理解下X86-Atom,ARM,MIPS三种处理器,这是第一篇,主Atom Intel公司的官网简单介绍了一句 “英特尔 凌动【III】 处理器&am…

Java培训的学费标准是多少
很多想要进入到互联网行业的小伙伴都会选择java这门编程语言,java编程语言技术在互联网公司是起着非常重要的作用的,那么如今市面上的java培训机构有很多,选择报Java培训的学费标准是多少呢?来看看下面的详细介绍。 Java培训的学费…

Numpy入门教程:08. 集合操作
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件
转载自:http://www.yifeiyang.net/iphone-development-skills-of-tool-papers-4-wav-file-conversion-using-afconvert/ 程序中经常使用 .WAV 的音效文件,虽然可以直接使用它,但是最好转换为 apple 推荐的 .CAF 格式。 这个时候我们就可以使用…

SQLite与pandas
以下链接对SQLite使用方法总结的很棒: http://www.cnblogs.com/yuxc/archive/2011/08/18/2143606.html 有关利用pandas读写QSLite的内容,可参考以下链接: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html http:…

零基础学习java,这些书一定要看!
学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出…

Numpy入门教程:练习作业01
序言 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

转乱码UTF8和UTF-8网页编码
http://www.lovelucy.info/utf8-vs-utf-8.html#more-794 一、遇到的问题 曾经被字符集间复杂的转换搞怕了,正好新项目要求国际化,需要能够显示多种语言,于是一开始就规定统统使用 UTF-8 编码。 所有代码文件使用 UTF-8 编码存盘MySQL数据库所…

linux管道的执行顺序
最近有个疑问,netstat -antup|head -500 类似这条命令中,是netstat 执行完然后截取前500条记录还是,netstat 与head 并行执行,netstat 执行完500条就不再继续? 最终答案由酷学园darkdanger大大提供: 唔…

为什么学习Python数据分析
为什么学习Python数据分析?这是很多人都比较关注的一个问题,Python编程语言近几年在互联网行业是非常火爆的,尤其是在人工智能这一领域,它会大大的提高我们的工作效率等等,具体来看看下面的详细介绍就知道了。 为什么学习Python数…

Python自动化开发学习6
引子 假设我们要在我们的程序里表示狗,狗有如下属性:名字、品种、颜色。那么可以先定义一个模板,然后调用这个模板生成各种狗。 def dog(name,d_type,color):data {name:name,d_type:d_type,color:color}return data d1 dog(小七,拉布拉多,…

Numpy入门教程:09. 输入和输出
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

第二语言综合征
前些天在看一本书,温伯格的《理解专业程序员》,其中提到有的程序员得了第二语言综合征——在学习第三、第四门语言的时候很容易,但是学习第二门简直能要了他们的命。我当时就确定我患了这个毛病,因为我一直想了解Java语言…

Python文件操作:finally子句的使用
finally子句与try-except语句连用时,无论try-except是否捕获到异常,finally子句后的代码都要执行,其语法格式如下: try: 可能出错的语句 ......except: 出错后的执行语句finally: 无论是否出错都会执行的语句 Python在处理文件时&…

Numpy入门教程:练习作业02
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

PowerShell 导入 SQL Server 的 PS 模块
接触过UNIX或者Linux 的朋友都知道此类系统有着功能强大、无所不能的壳程序,称之为Shell。微软公司于2006年第四季度正式发布PowerShell,它的出现标志着, 微软公司向服务器领域迈出了重要的一步, 不仅提供简便的图形化操作界面,同时提供类似于Unix, Linu…

ARM嵌入式操作系统启动
任何一个操作系统的启动都至少关注两个方面:1,程序运行栈的初始化。2,处理器外设的初始化。 在ARMv6以及以前的体系结构中,定义了七种模式分别为&…

Html5 aside标签的用法和作用
aside元素用来定义当前页面或者文章的附属信息部分,它可以包含与当前页面或主要内容相关的引用、侧边栏、广告、导航条等其他类似的有别于主要内容的部分。 aside元素的用法主要分为两种。 ● 被包含在article元素内作为主要内容的附属信息。 ● 在article元素之外使…

Numpy入门教程:10. 统计相关
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

Windows 7+Code::Blocks+wxWidgets实录(一)
环境配置篇 玩过Linux的人应该对Code::Blocks和wxWidgets并不陌生。 Code::Blocks是一款非常有名的代码编辑器,在linux下用不惯vim的话,这是个不错的选择。但千万不要把它和编译器混淆,CB本身并没有独立编译程序的功能,需要调用系…

技巧:两部解决U盘安装windows 7
第一步:准备一个4G的U盘并使用disk part 工具制作成引导盘1、在运行中输入cmd 回车2、在黑色的命令提示符界面中输入Diskpart3、插入U盘 并输入List Disk查看4、输入Select Disk 1 (选择你的U盘所在的标识)5、输入clean 清除旧的信息6、输入c…

报Java面授班有哪些优势
java技术在互联网行业的高速发展,让很多人都开始学习java技术,大家都想知道学习java技术面授班好还是网络班好,小编觉得当然是面授班比较好,下面小编就带大家来详细的了解一下报Java面授班有哪些优势? 报Java面授班有哪…

刻意练习:Python基础 -- Task13. datetime模块详解
datetime模块 datetime 是 Python 中处理日期的标准模块,它提供了 4 种对日期和时间进行处理的类:datetime、date、time 和 timedelta。 datetime类 class datetime(date):def __init__(self, year, month, day, hour, minute, second, microsecond, t…

关于java和c的选择结构和循环结构
java和c在这些结构上确实没区别。 另学会一个小技巧,在编辑界面选中段落之后按tab可以整体后移选中的段落,再按shifttab可以将选中的段落前移。转载于:https://www.cnblogs.com/hloli/archive/2012/03/15/2398675.html

从控制器到驱动器的WD——硬盘巨头启示录之西数篇
WD(Western Digital,西部数据)公司创立的时间比希捷公司还早近10年,但作为硬盘驱动器供应商的历史可不算长。1970年4月23日,一家名为General Digital(通用数字)的公司诞生了,其最初是…

java程序员入门先学什么开发者工具
学习java编程语言,那么开发工具是肯定少不了的,程序员入门基础中开发工具是一定要学会的,可以帮助开发者们提高开发效率、更优雅的写代码。由于开发者涉及的技术领域众多,以后端开发者的视角盘点平时可能用得到的工具,…

Numpy入门教程:11. 时间日期和时间增量
序言 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

C#事件的发送方和接收方(订阅方)
C#事件的发送方和接收方(订阅方)基于Windows的应用程序也是基于消息的,Windows使用预定义消息与应用程序通讯。.NET Framework将Windows消息封装在事件中,可以把事件作为对象之间的通讯介质。事件发送方:发送事件的对象…

后台管理界面模版
http://www.cssmoban.com/cssthemes/houtaimoban/index_3.shtml转载于:https://www.cnblogs.com/hellojesson/p/7805516.html