目录

一、说明

二、随机数生成

2.1 随机数生成器的要点

 2.2 常见的均匀分布随机生成器

2.3 常见的摸球抽样

三、随机函数的综合案例 

3.1 从指定样本中随机抽选出一个序列

3.2 随机一个N维张量的正态分布抽样

3.3 整数均匀分布抽样函数

3.4 标准正态分布

3.5. 产生出连续的【0-1】的均匀分布

3.6. 产生出连续的【0-1】的均匀分布

3.7 产生出连续的【0-1】的均匀分布

3.8 生成标准正态分布

3.9 二项式分布的样本生成


一、说明

        在日常开发中,我们会经常需要到随机数,那么这篇文章会给大家整理一下随机数的基本用法。本篇专门对python的numpy库中的random函数进行详细专门的阐述。凡数据挖掘中要分清楚什么是概率模型,什么是抽样数据。

二、随机数生成

2.1 随机数生成器的要点

随机数生成器的要点,不外乎三个:

  • 分布函数:一般是均匀分布和正态分布。
  • 数据类型,一般是整型和浮点型。
  • 张量维度,随用户需要而定

Python随机欠采样 python 随机取样_均匀分布

 2.2 常见的均匀分布随机生成器

随机生成0-1之间浮点数,均匀分布

random.random()这个方法会返回[0.0,1.0)之间的浮点数,返回的浮点数有可能生成0,但是绝对不会生成1。

import random
val = random.random()
print(val)

随机生成a-b之间浮点数

random.uniform(a, b)这个方法会返回[a,b)之间的浮点数,返回的浮点数有可能生成a,但是绝对不会生成b。

import random
val = random.uniform(1,10)
print(val)

随机生成a-b之间整数

random.randint(a, b)这个方法返回[a,b]之间随机的整数,返回的整数有可能是a,也有可能是b。

import random
val = random.randint(1,10)
print(val)

如果不想生成b,可以用下面的方法:

random.randrange(a, b)这个方法返回[a,b)之间随机的整数,返回的整数有可能是a,但是绝对不会生成b。

import random
val = random.randrange(1,10)
print(val)

2.3 常见的摸球抽样

如果想从指数递增当中随机选择一个数可以用random.randrange(10, 100, 2),结果相当于从[10,12,14,16…100]中随机选择一个。

import random
val = random.randrange(10, 100, 2)
print(val)

从列表中随机取出一个元素

random.choice(l)这个方法返回列表中任意一个元素。

import random
l = [1,2,3,4,5,6]
val = random.choice(l)
print(val)

打乱列表中元素的顺序

random.shuffle(l)这个方法把列表元素顺序打乱返回。

import random
l = [1,2,3,4,5,6]
random.shuffle(l)
print(l)
#out [6, 1, 5, 3, 4, 2]

我们发现,这个打乱数据在原数据做的操作,如果我们还需要原数据,最好在打乱之前先用copy模块里面的copy方法拷贝一份。

从列表中随机取出n个元素

random.sample(l, n)这个方法会从列表随机取出n个元素。

import random
l = [1,2,3,4,5,6]
val = random.sample(l,3)
print(val)
#out [4, 2, 1]

三、随机函数的综合案例 

3.1 从指定样本中随机抽选出一个序列

 np.random.choice(asize=Nonereplace=Truep=None)

  • 从数列a中随机选择size个元素。
  • replace为True表示选出的元素允许重复。
  • p为元素被选中的概率数列

举例:投掷六面体骰子100次后,得到的结果

import numpy as np
a = np.arange(1,7)
n2 = np.random.choice(a,100,replace=True, p=[1/6,1/6,1/6,1/6,1/6,1/6] )
print(a),print(n2)

Python随机欠采样 python 随机取样_python_02

3.2 随机一个N维张量的正态分布抽样

np.random.rand(d0d1...dn)

       产生维度为n的值属于[0,1)的正太分布抽样,(d0d1...dn)是每个维度的数组长度。

       例一:产生一个二维的,张量为<10,10>的正态分布随机数

np.random.rand(2,5)                                                                                                                                                 
array([[0.76591557, 0.51328605, 0.6392731 , 0.29288276, 0.06521177],
       [0.95525581, 0.45215736, 0.99532118, 0.59897804, 0.52397141]])

3.3 整数均匀分布抽样函数

np.random.randint(lowhigh=Nonesize=Nonedtype='l'))

  •         均匀分布的起始和终止值 [ low, high)
  •         抽样数size数量的离散均匀分布,默认数据类型为int;dtypf''http://np.int
  •         如果high为None,则产生属于[0,low)的离散均匀分布
  •         size值可以为数值(产生结果为一维),
  •         size也可以为list或者tuple(产生结果为二维或者多维)
  •         dtype: dtype(可选):想要输出的格式。如‘l’是int64、否则int等等
np.random.randint(0,10,5)                                                                                                                                           
array([0, 8, 7, 8, 9])
np.random.randint(0,10,(2,5))                                                                                                                                       
array([[4, 8, 3, 3, 8],
       [8, 3, 2, 5, 7]])
np.random.randint(2,size=10)                                                                                                                                        
array([1, 0, 0, 0, 1, 1, 1, 1, 1, 1])

3.4 标准正态分布

 np.random.randn(d0d1...dn)

  •         产生维度为(d0d1...dn)的标准正太分布。
  •         同np.random.standard_uniform(),这两个函数功能相同,只是参数写法不同

        标准正态分布又称为u分布,是以0为均数、以1为标准差的正态分布(mean=0, stdev=1),记为N(0,1)

np.random.randn(2,5)                                                                                                                                                
array([[-1.07605751,  0.31317055, -0.22755171,  1.20909518, -2.19104446],
       [-0.55637002, -0.22598989,  0.33682028, -1.37535475, -1.39989454]])

3.5. 产生出连续的【0-1】的均匀分布

 np.random.random(size=None)

  • size:任意的张量

        产生属于[0.0, 1.0)的size数量的连续均匀分布。size为list或者tuple时,产生相应维度的结果。

>>> np.random.random((2,5))
array([[0.57479102, 0.93349977, 0.5211282 , 0.69889345, 0.42233586],
       [0.9814506 , 0.64438959, 0.46074951, 0.35429536, 0.2283257 ]])
>>> np.random.random( 10)
array([0.93207672, 0.47943899, 0.69978292, 0.59946767, 0.33657945,
       0.8585162 , 0.56134744, 0.9577701 , 0.70489856, 0.70900494])

3.6. 产生出连续的【0-1】的均匀分布

        np.random.random_sample(size=None)

  •         结果来自于规定间隔内的“连续均匀”分布。
  •         size:任意的张量

        生成任意位置的均匀分布:样本 Unif[a, b), b > a 乘以的输出 random_sample 通过 (b-a) 并添加 a ::

        (b - a)  *  np.random.random_sample() + a

>>> 5*np.random.random_sample((2,5))+10
array([[13.02700564, 10.0586121 , 12.72167752, 11.38157269, 10.30069212],
       [12.96813519, 12.69532928, 10.33805862, 13.7314778 , 13.45160027]])

( 同:np.random.random(size=None) )

3.7 产生出连续的【0-1】的均匀分布

        np.random.sample(size=None)

( 同:np.random.random(size=None) )

3.8 生成标准正态分布

        np.random.standard_normal(size=None)

        同:np.random.randn(d0d1...dn),参数形式不同

np.random.standard_normal((2,5))                                                                                                                                    
array([[ 0.9860204 , -0.01338097, -2.35422435, -0.46540609,  1.86221193],
       [-0.52405505,  0.07280193, -0.13776652, -1.03335881, -1.62485683]])

3.9 二项式分布的样本生成

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

参数  

 解释

n

int型或者一个int型的数组,大于等于0,接受浮点数但是会被截断(官方解释:n is truncated to an integer,例如:输入4.6或者4.2都会被当做4来计算)成整数来使用。

p

    float或者一组float的数组,0≤p≤1;

size 

   可选项,int或者int的元组,表示的输出的大小,如果提供了size,例如(m,n,k),那么会返回m×n×k个数值。如果size=None,也就是默认没有的情况,当n和p都是一个数字的时候只会返回一个值,否则返回的是np.broadcast(n,p).size个数值。

return

    返回值。size是一个整数N时,返回一个长度为N的一维数组;size是(X,Y)类型元组时,返回一个X行Y列二维数组;size是(X,Y,Z)类型元组时,返回一个三维数组(三维数组不能以三维形式直接输出,会输出X个Y行Z列的二维数组,以此类推)。

        对二项分布进行采样。n表示采样次数,p表示成功的概率,size表示输出结果的形状(shape)

    

        例1: n=1时,重复伯努利试验。
        一次抛一枚硬币试验,正面朝上发生的概率为0.5,做10次实验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(1, 0.5, 10)
print(test)

      
        输出:[1 1 1 0 1 1 1 0 0 0]

        例2: n>1时,多个样本进行试验:
        一次抛5枚硬币,每枚硬币正面朝上概率为0.5,做10次试验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(5, 0.5, 10)
print(test)

输出:[1 5 5 2 4 2 3 3 2 3]

        例3: size为元组的形式时:
        一次抛5枚硬币,每硬币正面朝上概率为0.5,做50次试验,求每次试验发生正面朝上的硬币个数:

test = np.random.binomial(5, 0.5, (10, 5))
print(test)

输出二维数组(ndarray类型):

[[1 2 2 4 1]
 [2 5 3 4 3]
 [1 4 1 2 4]
 [3 1 1 3 1]
 [1 4 2 4 2]
 [0 1 3 2 2]
 [4 2 1 1 2]
 [2 5 3 2 3]
 [1 1 2 2 2]
 [3 2 1 4 2]]

        例4: 一次抛2个硬币,每枚硬币抛到正反两面的概率都是0.5,那么两个硬币都是正面的概率是多少?发生一正一反的概率是多少?
        显然答案是0.25和0.5,试验次数越大,越能接近理论概率:

test = sum(np.random.binomial(2, 0.5, 100000) == 2) / 100000
    print(test)

        输出:0.24843

test = sum(np.random.binomial(2, 0.5, 100000) == 1) / 100000
    print(test)

        输出:0.49938