Day07:随机抽样

随机抽样

numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数,如正态分布、泊松分布等。
numpy.random.seed(seed=None)
seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的 seed() 值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。

离散型随机变量

  1. 二项分布
    二项分布即为伯努利分布,二项分布是n个独立的成功or失败试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。这样的单次成功or失败试验又称为伯努利试验。(官方解释)在n次实验中,只出现两种结果的事件(对应概率相等)称为二项分布。(笔者解释)
    计算公式为:二项分布数学公式
    代码表示为:
binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)

**numpy.random.binomial(n,p,size=None)**从二项式中提取样本数据
n:重复试验次数
p:成功的概率
size:采样次数

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(20201124)
n=10
p=0.2
size=100000
x=np.random.binomial(n,p,size)
print(np.sum(x==0)/size)
plt.hist(x)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
s=stats.binom.pmf(range(10),n,p)
print(np.around(s,3))
#0.10766
#[0.11 0.27 0.3  ... 0.   0.   0.  ]

如果觉得柱状图比较丑的话可以参考一下bar()函数的应用
bar()函数的应用
#计算期望和方差’’’
期望:E(x) = np
方差:Var(x) = np(1‐p)
利用stats.binom.stats(n, p, loc=0, moments=‘mv’)计算期望和方差moments参数中:m为期望,v为方差
‘’’
scipy.stats函数库

import numpy as np
from scipy import stats
np.random.seed(20201124)
n=5
p=0.3
mean,var=stats.binom.stats(n, p, loc=0, moments='mv')#stats 计算平均值,方差,峰值和倾斜角
print(mean,var)
#1.5 1.0499999999999998
  1. 泊松分布
    泊松分布主要用于估计某个时间段某事件发生的概率。
    泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam) lam*k / k!
    泊松概率函数的数学表示:
    泊松分布数学公式
    **numpy.random.poisson(lam=1.0, size=None)**从泊松分布中提取数据样本
    size:采样次数
    lam:一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。
    补充一下中文限制符
    (导入numpy的中文数据库就可以省略此步骤)
import matplotlib.pyplot as mpl
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
fig,ax = plt.subplots(1,1)
#【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import matplotlib.pyplot as mpl
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
fig,ax = plt.subplots(1,1)
np.random.seed(20201124)
lam=42/6  #平均每十分钟接到7次订票电话
size=100000
x=np.random.poisson(lam,size)
print(np.sum(x==6)/size)
#0.14853
plt.hist(x)
plt.xlabel("每十分钟接到的订票次数")
plt.ylabel("10w样本中出现的数据")
plt.show()
x=stats.poisson.pmf(6,lam)#pmf表示概率质量函数
print(x)
#0.14900277967433773

样本数据的泊松分布图

  1. 超几何分布
    超几何分布的特点:各项试验彼此独立,概率不相同
    超几何分布数学公式:
    超几何分布概率公式
    1、超几何概率分布的期望和方差公式。
    2、超几何分布的方差 D(X)=np(1-p)* (N-n)/(N-1)。
    3、超几何分布中的参数是M,N,n。

**numpy.random.hypergeometric(ngood, nbad, nsample, size=None)**提取样本。
size:采样次数
ngood:提取到具有成功标志的个数
nbad:提取到不具有成功标志的个数
nsample:抽取元素的次数,函数返回值表示nsample中具有成功标志的元素个数

#【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201125)
size=10000
x=np.random.hypergeometric(ngood=7,nbad=13,nsample=12,size=size)
print(np.sum(x==3)/size)
#0.1948
plt.hist(x,bins=8)
plt.xlabel("狗的数量")
plt.ylabel("10000个样本中狗出现的次数")
plt.title("超几何分布",fontsize=20)
plt.show()
x=range(8)
s=stats.hypergeom.pmf(k=x,M=20,n=7,N=12)#累计的概率质量函数
#M为总体容量,n<=>ngood,N<=>nsample,k为在抽取的动物中狗的个数
print(np.round(s,3))
#[0.   0.   0.05 ... 0.29 0.1  0.01]

超几何分布

连续型随机变量

  1. 均匀分布
    特点:在相同长度间隔的分布概率是等可能的,由最大值high,最小值low定义
    **numpy.random.uniform(low=0.0, high=1.0, size=None)**从均匀分布的数据中抽样
    这里补充一下all()函数和any()函数:all()函数表示判断数组中的元素是否满足条件,返回类型为bool值,而any()函数表示至少有一个元素满足就返回True否则为Flase.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201125)
a=0
b=10
size=10000
x=np.random.uniform(a,b,size=size)
print(np.all(x>=0))
print(np.all(x<10))
#True
#True
y=(np.sum(x<5)-np.sum(x<1))/size
print(y)
#0.4063
a=stats.uniform.cdf(1,0,10)#累积分布函数
b=stats.uniform.cdf(5,0,10)
print(b-a)
#0.4
plt.hist(x,bins=20)#bins是通常是柱体个数
plt.show()

均匀分布
**numpy.random.rand(d0, d1, …, dn)**给定形状的随机值
什么意思呢?就是在一个给定形状的数组中用某一个区间产生的均匀分布的随机值来填充它。
**numpy.random.randint(low, high=None, size=None, dtype=‘l’)**返回最小值和最大值之间的一个随机整数
没有最大值的时候默认0为最小值,原来的最小值变为最大值

import numpy as np
np.random.seed(20201125)
x=np.random.randint(2,size=5)#如果是浮点型的话,可以写一个浮点型的函数进行封装
print(x)
x=np.random.randint(4,size=(3,2))#没有最大值的时候可以默认0为最小值
print(x)
x=np.random.randint(1,5,size=6)
print(x)
x=np.random.randint(1,5,size=(3,2))
print(x)
#[1 1 1 1 1]
#[[0 2]
# [3 1]
# [0 1]]
#[1 1 2 1 3 1]
#[[4 2]
# [3 2]
# [4 4]]
  1. 正态分布

正态分布:若随机变量X服从一个数学期望为μ、方差为σ2的正态分布,记为N(μ,σ2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
标准正态分布数学表达式:
标准正态分布数学表达式
**numpy.random.randn(d0, d1, …, dn)**从标准值(给定的σ 值)返回样品的正态分布

#根据指定大小产生满足标准正态分布的数组(均值为0,标准差为1)
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(20201125)
size=10000
x=np.random.randn(size)
y1=(np.sum(x<1)-np.sum(x<-1))/size#求每个区间的分布概率
y2=(np.sum(x<1)-np.sum(x<-2))/size
y3=(np.sum(x<1)-np.sum(x<-3))/size
print(y1)
print(y2)
print(y3)
#0.6853
#0.8231
#0.8459
plt.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)
print(y2)
print(y3)
#0.6826894921370859
#0.9544997361036416
#0.9973002039367398

正态分布曲线

  1. 指数分布
    指数分布描述时间发生的时间长度间隔。
    指数分布数学表达式:
    指数分布数学表达式
    **numpy.random.exponential(scale=1.0, size=None)**从指数中提取样本进行分配
import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

np.random.seed(202001125) 
lam=6#均值
size=10000
x=np.random.exponential(1/lam,size) 
y1=(np.sum(x<1/6))/size
y2=(np.sum(x<2/6))/size
y3=(np.sum(x<3/6))/size
print(y1)
print(y2)
print(y3)
#0.6288
#0.8616
#0.9481
plt.hist(x,bins=20)
plt.show()
y1=stats.expon.cdf(1/6,scale=1/lam)#scale为标准差
y2=stats.expon.cdf(2/6,scale=1/lam)
y3=stats.expon.cdf(3/6,scale=1/lam)
print(y1)
print(y2)
print(y3)
#0.6321205588285577
#0.8646647167633873
#0.950212931632136

正态分布曲线

随机从序列中获取数列

**numpy.random.choice(a, size=None, replace=True, p=None)**从给定的数组中生成随机数,若 a 为整数,元素取值从 np.range(a) 中随机获取;若 a 为数组,取值从 a 数组元素中随机获取。该函数还可以控制生成数组中的元素是否重复 replace ,以及选取元素的概率 p 。

import numpy as np
np.random.seed(20201125)
x=np.random.choice(6,3)
print(x)
x=np.random.choice(6,3,p=[0.1,0.2,0.5,0.11,0.09,0])
print(x)
x=np.random.choice(6,3,replace=False,p=[0.1,0.2,0.5,0.11,0.09,0])
print(x)
a_arr=['gao','wang','liang','fu','fang']
x=np.random.choice(a_arr,3,p=[0.1,0.2,0.5,0.11,0.09])
print(x)
#[3 3 3]
#[2 1 2]
#[1 2 0]
#['liang' 'liang' 'wang']

对数据集进行洗牌操作

数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。
**numpy.random.shuffle(x)**通过对其内容进行洗牌来修改序列,多维数组中只对行进行打乱,也可打乱内在元素(行)之间的序列。
numpy.random.permutation(x) permutation(x)和shuffle(x)函数相同,但permutation(x)不打乱行内的序列和数组的第一行

import numpy as np
np.random.seed(20201125)
x=np.arange(10)
np.random.shuffle(x)
print(x)
#[7 2 4 ... 6 8 3]
y=np.random.permutation(x)
print(y)
#[7 6 8 ... 0 4 2]
x=np.arange(15).reshape((3,5))#数组的行数和列数之积必须等于arange值
print(x)
#[[ 0  1  2  3  4]
# [ 5  6  7  8  9]
# [10 11 12 13 14]]
np.random.shuffle(x)
print(x)
#[[10 11 12 13 14]
# [ 5  6  7  8  9]
# [ 0  1  2  3  4]]
y=np.random.permutation(x)
print(y)
#[[ 0  1  2  3  4]
# [10 11 12 13 14]
# [ 5  6  7  8  9]]

当你看到这里的时候说明你也是一个爱好学习的人,希望我们能一起保持这个好习惯。最后,欢迎大家指正,一起加油哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值