Python零基础投喂(2.随机抽样)
作者:互联网
随机抽样
'''numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分
布的样本值的函数,如正态分布、泊松分布等。
numpy.random.seed(seed=None) Seed the generator.
seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的 seed() 值,则每次生成的随
机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间
差异而不同。
*注意:
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指
定唯一的随机种子,避免由于随机的差异对结果产生影响。'''
一、离散型随机变量
1.二项分布
# 二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如
# 处理猜10次拳赢6次的概率等类似的问题。
'''在一次试验中事件A出现的概率为p,事件A不出现的概率为q=1-p.
若以X记一次实验中A出现的次数,则X仅取0、1两个值。X=k的概率为
p**k (1-p)**(n-k)则称X服从两点分布
代码:
numpy.random.binomial(n, p, size=None)
表示对一个二项分布进行采样, size 表示采样的次数, n 表示做了 n 重伯努利试验, p 表示成功的
概率,函数的返回值表示 n 中成功的次数。
'''
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
#举例:野外正在进行9(n=9)口石油勘探井的发掘工作,每一口井能够开发出油的概率是
#0.1(p=0.1)。请问,最终所有的勘探井都勘探失败的概率?
np.random.seed(20200605)
n=9
p=0.1
size=50000
#binomial n.二项分布
x=np.random.binomial(n,p,size)
np.set_printoptions(threshold=50) #size>50,所以只能概略显示。
x
array([0, 2, 1, ..., 1, 0, 1])
print(np.sum(x==0)/size)
0.3897
'''或者使用binom.rvs
#使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray'''
y
# matplotlib可视化:hist()--直方图
#参数:
'''
x: 数据集,最终的直方图将对数据集进行统计
bins: 统计的区间分布
range: tuple, 显示的区间,range在没有给出bins时生效
density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density
histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似
align: 可选{'left', 'mid', 'right'}之一,默认为'mid',控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
log: bool,默认False,即y坐标轴是否选择指数刻度
stacked: bool,默认为False,是否为堆积状图
alpha设置透明度,0为完全透明
'''
#plt.hist(x,bins=8)
plt.hist(x)
#plt.xlim(-1,6) #设置X轴范围
plt.xlabel('x')
plt.ylabel('y')
plt.show()
s = stats.binom.pmf(range(10), n, p)
print(np.around(s, 3))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVRhirOE-1606310225866)(output_9_0.png)]
[0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]
#【例】模拟投硬币,投2次,请问两次都为正面的概率?
np.random.seed(20200605)
n=2
p=0.5
size=50000
x=np.random.binomial(n,p,size)
print(x)
print(np.sum(x==0)/size)
print(np.sum(x==1)/size)
print(np.sum(x==2)/size)
plt.hist(x,density=True)
plt.xlabel('Number of heads')
plt.ylabel('The number of occurrences')
[1 2 1 ... 1 0 1]
0.25154
0.49874
0.24972
Text(0, 0.5, 'The number of occurrences')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ebKn4Jpn-1606310225870)(output_10_2.png)]
2.泊松分布
#泊松分布主要用于估计某个时间段某事件发生的概率。
#泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam) lam*k / k!
# numpy.random.poisson(lam=1.0, size=None)
# 表示对一个泊松分布进行采样, size 表示采样的次数, lam 表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数。
#【例】假定某航空公司预定票处平均每小时接到42次订票电话,那么10分钟内恰好接到6次电话的概率是多少?
np.random.seed(20200605)
lam=42/6
size=50000
x=np.random.poisson(lam,size)
print(np.sum(x==6)/size)
plt.hist(x)
plt.xlabel('Number of calls received in ten minutes')
plt.ylabel('The number of occurrences')
plt.show()
#用poisson.pmf(k, mu)求对应分布的概率:概率质量函数 (PMF)
x = stats.poisson.pmf(6, lam)
print(x)
0.14988
0.14900277967433773
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dYy666aX-1606310225871)(output_13_1.png)]
3.超几何分布
# numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
'''
表示对一个超几何分布进行采样, size 表示采样的次数, ngood 表示总体中具有成功标志的元素个
数, nbad 表示总体中不具有成功标志的元素个数, ngood+nbad 表示总体样本容量, nsample 表示抽
取元素的次数(小于或等于总体样本容量),函数的返回值表示抽取 nsample 个元素中具有成功标识
的元素个数。
'''
#【例】一共20只动物里有7只是狗,抽取12只有3只狗的概率(无放回抽样)。
np.random.seed(20200605)
size=50000
x=np.random.hypergeometric(ngood=7,nbad=13,nsample=12,size=size)
print(np.sum(x==3)/size)
#画图:
plt.hist(x)
plt.hist(x,bins=10)
plt.xlabel('Number of dogs')
plt.ylabel('The number of occurrences')
plt.title('Hypergeometric distribution',fontsize=20)
plt.show()
0.19938
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBkWOfDz-1606310225873)(output_16_1.png)]
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 ]
二、连续性随机变量
1.均匀分布
# numpy.random.uniform(low=0.0, high=1.0, size=None)
#【例】在low到high范围内,创建大小为size的均匀分布的随机数。计算10-50的概率
np.random.seed(20200614)
a=0
b=100
size=50000
x=np.random.uniform(a,b,size=size)
print(np.all(x>0))
print(np.all(x<100))
y=((np.sum(x<50)-np.sum(x<10))/size)
print(y)
True
True
0.40144
plt.hist(x,bins=110)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6PrS5JqA-1606310225875)(output_21_0.png)]
# 求对应分布的概率
a = stats.uniform.cdf(10, 0, 100)
b = stats.uniform.cdf(50, 0, 100)
print(b-a)
0.4
# numpy.random.rand(d0, d1, ..., dn) Random values in a given shape. 可以得到 [0,1) 之间的均匀分布的随机数。
np.random.seed(20200614)
#这里的RANDOM并非真随机,如果设定了种子20200614,则随机数会固定
print(np.random.rand())
0.7594819171852776
print(np.random.rand(5))
print(np.random.rand(4,3))
[0.75165827 0.16552651 0.0538581 0.46671446 0.89076925]
[[0.10073292 0.14624784 0.40273923]
[0.21844459 0.22226682 0.37246217]
[0.50334257 0.01714939 0.47780388]
[0.08755349 0.86500477 0.70566398]]
# numpy.random.randint(low, high=None, size=None, dtype='l')
# 可以得到 [low,high) 之间均匀分布的随机整数。
#注:若 high 不为 None 时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
np.random.seed(20200614)
x=np.random.randint(2,size=10) #产生0-2随机整数
print(x)
x=np.random.randint(5,size=(2,4)) #产生0-5随机整数
print(x)
x=np.random.randint(1,10,[3,4]) #产生1-10随机整数
print(x)
[0 0 0 1 0 1 0 0 0 0]
[[3 3 0 1]
[1 1 0 1]]
[[2 1 7 7]
[7 2 4 6]
[8 7 2 8]]
2、正态分布
# numpy.random.randn(d0, d1, ..., dn) 正态分布
#randn(random normal distribution)是一种产生标准正态分布的随机数或矩阵的函数
np.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)
print(y2)
print(y3)
0.68596
0.95456
0.99744
plt.hist(x)
(array([7.0000e+00, 8.7000e+01, 1.2000e+03, 6.1440e+03, 1.5306e+04,
1.6762e+04, 8.4120e+03, 1.8840e+03, 1.9000e+02, 8.0000e+00]),
array([-4.71620661, -3.79707484, -2.87794308, -1.95881131, -1.03967954,
-0.12054778, 0.79858399, 1.71771575, 2.63684752, 3.55597929,
4.47511105]),
<a list of 10 Patch objects>)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8v7ABFbR-1606310225876)(output_28_1.png)]
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(round(y1,2))
print(y2)
print(y3)
0.68
0.9544997361036416
0.9973002039367398
# 指定分布(通过指定参数)
#还可以指定分布以及所需参数来进行随机,例如高斯分布中的mu和sigma。
# numpy.random.normal(loc=0.0, scale=1.0, size=None)
# normal() 为创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
np.random.seed(20200614)
x=0.5*np.random.randn(2,4)+5
x
array([[5.39654234, 5.4088702 , 5.49104652, 4.95817289],
[4.31977933, 4.76502391, 4.70720327, 4.36239023]])
#均值,标准差
mu=5
sigma=0.5
x=np.random.normal(mu,sigma,(2,4))
print(x)
size=50000
x=np.random.normal(mu,sigma,size)
#均值
print(np.mean(x))
#标准差
print(np.std(x,ddof=1))
print(np.std(x,ddof=0))
#ddof:int, optional
#Means Delta Degrees of Freedom. The divisor used in calculations is N ‐ ddof, where N
#represents the number of elements. By default ddof is zero.
'''计算标准差时,需要注意numpy中的std和pandas的std在计算标准差时,默认的计算结果会存在不一致的问题。
原因在于默认情况下,
numpy计算的为总体标准偏差,ddof=0;一般在拥有所有数据的情况下,计算所有数据的标准差时使用,即最终除以n,而非n-1;
pandas计算的为样本标准偏差,ddof=1;一般在只有部分数据,但需要求得总体的标准差时使用,当只有部分数据时,根据统计规律,除以n时计算的标准差往往偏小,因此需要除以n-1,即n-ddof;'''
[[4.82423097 4.50623086 5.57960392 5.31112597]
[4.13592613 4.83127793 4.80370195 4.96827214]]
5.001928350431358
0.4987314758030604
0.49872648846336554
'计算标准差时,需要注意numpy中的std和pandas的std在计算标准差时,默认的计算结果会存在不一致的问题。\n\u2002\u2002\u2002\u2002原因在于默认情况下,\n\u2002\u2002\u2002\u2002numpy计算的为总体标准偏差,ddof=0;一般在拥有所有数据的情况下,计算所有数据的标准差时使用,即最终除以n,而非n-1;\n\u2002\u2002\u2002\u2002pandas计算的为样本标准偏差,ddof=1;一般在只有部分数据,但需要求得总体的标准差时使用,当只有部分数据时,根据统计规律,除以n时计算的标准差往往偏小,因此需要除以n-1,即n-ddof;'
plt.hist(x)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOrv22Et-1606310225877)(output_32_0.png)]
y=np.arange(10)
print(y)
print(np.std(y,ddof=1))
print(np.std(y))
#在小样本时,ddof参数影响很大
[0 1 2 3 4 5 6 7 8 9]
3.0276503540974917
2.8722813232690143
3、指数分布
# 指数分布描述时间发生的时间长度间隔。
# numpy.random.exponential(scale=1.0, size=None)
np.random.seed(20200614)
lam=7
size=50000
# exponential 指数的; 幂的; 由指数表示的; 越来越快的
x=np.random.exponential(1/lam,size)
print(x)
[0.20356571 0.19899279 0.02585062 ... 0.22070965 0.09659011 0.07831193]
y1=(np.sum(x<1/7))/size
y2=(np.sum(x<2/7))/size
y3=(np.sum(x<3/7))/size
y4=(np.sum(x>6/7))/size
print(y1)
print(y2)
print(y3)
print(y4)
0.63218
0.86518
0.95056
0.00254
plt.hist(x)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BxhDePij-1606310225878)(output_37_0.png)]
三、其他随机函数
1、随机序列中获取元素
# numpy.random.choice(a, size=None, replace=True, p=None)
'''从序列中获取元素,若 a 为整数,元素取值从 np.range(a) 中随机获取;若 a 为数组,取值从 a 数组
元素中随机获取。该函数还可以控制生成数组中的元素是否重复 replace ,以及选取元素的概率 p 。'''
np.random.seed(20200614)
x=np.random.choice(10,3)
print(x)
[2 0 1]
x = np.random.choice(10, 3, p=[0.3, 0, 0.3, 0.4, 0, 0, 0, 0, 0, 0])
#p之和=1,相当于给每个取值赋权,概率
print(x)
[3 0 0]
# 该函数还可以控制生成数组中的元素是否重复 replace
x=np.random.choice(10,3,replace=False,p=[0.3, 0, 0.3, 0.4, 0, 0, 0, 0, 0, 0])
print(x)
[2 0 3]
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)
['rabbit' 'pooh' 'pooh' 'pooh' 'Christopher']
2、对数据集进行洗牌操作
'''数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要
先对数据集进行洗牌操作。'''
# numpy.random.shuffle(x) Modify a sequence in-place by shuffling its contents
# 对 x 进行重排序,如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组,输出为None。
np.random.seed(20200614)
x=np.arange(10)
np.random.shuffle(x)
print(x)
[6 8 7 5 3 9 1 4 0 2]
# random()是Python的随机数函数,shuffle()方法可以将输入的列表数据->打乱顺序->重新输出。
# 但是如果直接打印print,就会返回None,没有显示正确数据。
# 所以不能打印shuffle()方法,只能打印值
x=[1, 4, 9, 12, 15]
np.random.shuffle(x)
print(x)
[4, 15, 12, 9, 1]
x=np.arange(20).reshape(5,4)
print(x)
# 如果 x 为多维数组,只沿第 0 轴洗牌,改变原来的数组
np.random.shuffle(x)
print(x)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]]
[[ 0 1 2 3]
[ 8 9 10 11]
[16 17 18 19]
[12 13 14 15]
[ 4 5 6 7]]
知识小练习(尽量独立完成)
'''1、创建一个形为5×3的二维数组,以包含5到10之间的随机数。
【知识点:随机抽样】
如何创建随机二维数组?'''
np.random.seed(20201124)
y=np.random.uniform(5,10,15)
print(y)
x=y.reshape(5,3)
x
[5.8297881 5.93565697 5.80705135 5.43505742 9.47477011 7.20071935
7.27048307 5.77376478 8.50588319 5.98355676 8.1457441 8.03999241
8.46563166 5.37097747 7.33782422]
array([[5.8297881 , 5.93565697, 5.80705135],
[5.43505742, 9.47477011, 7.20071935],
[7.27048307, 5.77376478, 8.50588319],
[5.98355676, 8.1457441 , 8.03999241],
[8.46563166, 5.37097747, 7.33782422]])
'''生成相应的数据
【知识点:随机抽样】
'''
np.random.seed(20201124)
size=50000
x1=np.random.uniform(-10,10,size)
print(x1)
[-6.68084759 -6.25737212 -6.7717946 ... -3.397092 3.02377734
-8.65548496]
def f(x):
if x != 0:
print(np.sin(x)/x)
else:
print(1)
标签:10,plt,Python,random,基础,print,np,随机抽样,size 来源: https://blog.csdn.net/qq_41185007/article/details/110146387