Numpy系列目录
Numpy内置了random伪随机数模块,用于生成随机数。伪随机是用确定性的算法计算出
随机数序列的算法,并不真正的随机,一般统计意义上看我们仍然可以视为真随机数。
random模块有两种不同的API:
两种方法大部分函数是相同的。
默认情况下,Generator使用PCG64提供的位,该位具有比RandomState中的传统mt19937随机数
生成器更好的统计属性。
新版本推荐使用新版的Generator,老版本只能用RandomState。
两种方式对应的方法大部分是相同的,但是也有小部分不一样。
在使用中需要注意,比如rand, randn等方法是RandomState独有的,而integers方法是Generator独有的。
使用方法
旧版RandomState使用方法:
新版(Generator)使用方法
rng=np.random.default_rng()
rng.random()
避免不支持新版本api的兼容写法
try:
rng_integers = rng.integers
except AttributeError:
rng_integers = rng.randint
a = rng_integers(1000)
1.2.1 [0,1)均匀分布随机数
注意rng没有rand()方法。
1.2.2 [low,high)均布随机整数
[low, high)
的随机整数,填充size形状数组
random.randint(10)
:生成一个[0,10)
的随机整数random.randint(5,10)
:生成一个[5,10)
的随机整数random.randint(0,5,10)
:10个随机数组成的向量random.randint(0,5,(2,2)
,dtype=np.int32) 随机数数组np.random.randint(1, [3, 5, 10])
:生成一个3个元素的向量,元素范围分别为[1,3),[1,5),[1,10)
np.random.randint([1, 5, 7], 10)
:生成一个3个元素的向量,元素范围分别为[1,10),[5,10),[7,10)
np.random.randint([1, 3, 5, 7], [[10], [20]])
:生成一个2行4列的数组,low分别为1,3,5,7,high分别为10,20random.randint和rgn.integers都可以设置dtype参数。
1.2.3 标准正态分布随机数
期望为0,标准差为1的正态分布称为标准正态分布。
random.standard_normal()
:生成一个标准正态分布随机数,即标准正态分布的一个样本random.standard_normal(10)
:生成一个向量random.standard_normal((10,2))
:生成多维数组rng.standard_normal可以指定dtype,random.standard_normal和random.randn不行。
1.2.4 随机字节串
random.bytes(1)
:一个随机byte。不支持默认长度。random.bytes(10)
:10个随机byte。不支持多维。rng.bytes(1)
:一个随机byte。不支持默认长度。rng.bytes(10)
:10个随机byte。不支持多维。1.2.5 从样本随机选择
random.choice([1,2,3,4], size)
:随机从样本中抽取size个值,size可以为整数,也可以为元组。random.choice([1,2,3,4], size, replace=False)
:不能重复抽取样本,所以抽取数必须小于样本数。本例中size不能大于4random.choice(5,size)
:样本取np.arange(5)random.choice(5,size, p=[0.1, 0, 0.3, 0.6, 0])
:非均布抽取,p表示每个样本被抽取的概率rng.choice([[1,2,3],[2,3,4]],2)
:抽取两次列向量,得到2,2数组通过设置随机种子可以使得生成的随机数可重复,即两次生成随机数相同。
1.3.1 RandomState设置种子
np.random.seed(n)
>>> random.seed(2020)
>>> random.random()
0.9862768288615988
>>> random.seed(2020)
>>> random.random()
0.9862768288615988
- 种子为正整数
- 种子相同随机数相同
- 每次生成随机数前都要设置一遍。
rand = np.random.RandomState(n)
>>> rand = random.RandomState(2020)
>>> rand.random()
0.9862768288615988
>>> rand.random()
0.8733919458206546
>>> rand = random.RandomState(2020)
>>> rand.random()
0.9862768288615988
同样每次生成随机数前都要设置一遍。
1.3.2 Generator设置种子
创建Generator对象时设置种子:rng = np.random.default_rng(2020)
>>> rng = np.random.default_rng(2020)
>>> rng.random()
0.46830754332228663
>>> rng = np.random.default_rng(2020)
>>> rng.random()
0.46830754332228663
1.4.1 打乱顺序
打乱数组本身的顺序
random.shuffle(a)
:改变a内元素的顺序(多维数组只改变第0维的顺序)rng.shuffle(a)
:改变a内元素的顺序(多维数组只改变第0维的顺序)
rng.shuffle(a,1)
:改变a内元素第1维的顺序。多维数组指定改变顺序的维度,random.shuffle不支持。1.4.2 创建乱序数组
得到排序后的副本
random.permutation(a)
:生成一个数组打乱顺序后的副本,类似shuffle(a.copy())。多维数组按第0维打乱顺序rng.permutation(a)
:生成打乱顺序的副本,多维数组打乱第0维顺序。
rng.permutation(a,1)
:打乱列(axis=1)顺序。1.4.3 多维数组所有元素打乱顺序
得到排序后的副本
rng.permuted(a)
:所有元素打乱,不分维度
rng.permuted(a,axis=0)
:按指定维度打乱顺序,同rng.permutation(a,0)random没有此方法。
随机抽样,即按照特定分布随机生成若干个样本
随机抽取符合特定分布的序列,抽取的序列内的随机数符合指定的分布。即获得一个符合指定分布的样本。
又名两点分布。一件事情/一次实验,只有0,1两种结果。
变量只有0,1两个值。变量的概率:1的概率为p,0的概率为1-p。
典型的伯努利分布,单次抛硬币的建模,随机变量X只能取{0, 1}。
多次抛硬币就是二项分布。
一个样本为n次伯努利实验成功的次数。
样本足够多时,其成功次数的概率分布和二项分布公式一致。
random.binomial(10,0.5)
:抽取一个样本(单次概率p=0.5,10次试验成功的次数)。random.binomial(10,0.5,100)
:根据n,p计算的一个样本(成功的次数),生成100个样本。random.binomial(10,0.5,(2,2))
:样本数为数组。
- n为试验次数,n>=0
- p为单次试验成功的概率,p为
[0,1]
浮点数。
n次伯努利实验成功的次数为变量的离散概率分布。
n重伯努利试验,每次伯努利试验的成功概率为p,x(x=0~n)次实验成功的概率P(x)分布为二项分布。
多次伯努利试验连续失败,第x次成功,则输出x。x为几何分布的一个样本。
样本足够多时,x的概率分布与几何分布一致。
random.geometric(0.5)
:单次概率为0.5,给出第1次成功需要试验的次数random.geometric(0.2,100)
:根据p计算一个样本,100个样本。random.geometric(0.3,(2,2))
:样本数为数组。
- p为单次伯努利试验成功的概率
在n次伯努利试验中,试验k次才得到第一次成功的机率。
详细地说,是:前k-1次皆失败,第k次成功的概率。
单位时间内随机事件发生的次数为一个样本。
random和rng语法相同
poisson()
:λ=1抽取一个样本poisson(10)
:指定λ=10抽取一个样本poisson(10,10)
:抽取10个样本poisson(5,(2,2))
:样本size为多维数组
- 参数λ(λ≥0)是单位时间(或单位面积)内随机事件的平均发生次数。相当于二次分布的均值即np。
- 变量(一个样本)为单位时间内发生的次数。
当二项分布的n很大而p很小时,泊松分布可作为二项分布的近似。
通常当n≧20,p≦0.05时,就可以用泊松公式近似得计算。
random和rng语法相同
uniform()
:[0,1)
内均匀抽取一个样本uniform(1,5)
:[1.0,5.0)
内均匀抽取一个样本uniform(1,3,size)
:抽取size个样本指数分布的区间是[0,∞)
。
random和rng语法相同
exponential()
:抽取一个样本,期望为1exponential(10,size)
:抽取size个样本,期望为10
- λ>0是分布的一个参数,等于分布的期望。
- λ常被称为率参数,即每单位时间内发生某事件的次数。
指数分布是描述泊松过程中的事件之间的时间的概率分布。是伽马分布的一个特殊情况。
random和rng语法相同
- loc参数是期望,即均值
- scale参数为标准差
对数正态分布(logarithmic normal distribution)是指一个随机变量的对数服从正态分布
random和rng语法相同
random和rng语法相同
- 伽玛分布一般和指数分布一起理解:指数分布解决的问题是“要等到一个随机事件发生,需要经历多久时间”
- 伽玛分布解决的问题是“要等到n个随机事件都发生,需要经历多久时间”。
- Gamma分布中的参数α称为形状参数,β称为逆尺度参数。其中α>0,β>0
- 当形状参数α=1时,,就变成了指数分布。
- 当α=n/2,β=1/2时,伽马分布就是自由度为n的卡方分布
- 伽玛分布可以看作是n个指数分布的独立随机变量的加总。负二项分布的极限。
random和rng语法相同
random和rng语法相同
- k>0是形状参数(shape parameter)
- 如,当k=1,它是指数分布;k=2且时,是Rayleigh distribution(瑞利分布)。
random和rng语法相同
- α>0,β>0
一个作为伯努利分布和二项式分布的共轭先验分布的密度函数,是dirichlet分布的特例。
是指一组定义在(0,1)区间的连续概率分布。
狄利克雷分布又称多元Beta分布,多项分布的共轭先验。
参数α时一个向量,向量元素>0。输出样本shape为(size, len(α))
拉普拉斯分布可以看作是两个不同位置的指数分布背靠背拼接在一起,所以它也叫作双指数分布。
拉普拉斯分布的两个参数:
random和rng语法相同
若n个相互独立的随机变量均服从标准正态分布,则这n个随机变量的平方和构成一新的随机变量,
其分布规律称为卡方分布。n为其自由度。
random和rng语法相同
F分布是两个服从卡方分布的独立随机变量各除以其自由度后的比值的抽样分布,
是一种非对称分布,且位置不可互换。
其中两个参数都必须大于零,即dfnum(分子中的自由度)和dfden(分母中的自由度)。
Numpy系列目录
个人总结,部分内容进行了简单的处理和归纳,如有谬误,希望大家指出,持续修订更新中。
修订历史版本见:https://github.com/hustlei/AI_Learning_MindMap
未经允许请勿转载。