随机抽样

本文程序可直接运行,但图片导入有点问题;

numpy.random 模块对 Python 内置的 random 进行了补充,增加了一些用于高效生成多种概率分
布的样本值的函数,如正态分布、泊松分布等。

  • numpy.random.seed(seed=None) Seed the generator.

seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed() 值,则每次生成的随
机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间
差异而不同。

在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指
定唯一的随机种子,避免由于随机的差异对结果产生影响。

离散型随机变量

二项分布

二项分布可以用于只有一次实验只有两种结果,各结果对应的概率相等的多次实验的概率问题。比如
处理猜10次拳赢6次的概率等类似的问题。

二项分布概率函数的代码表示:binom.pmf(k) = choose(n, k) pk (1-p)(n-k)
二项分布概率函数的数学表示:

  • 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(20201125)
n = 9
p = 0.1
size = 50000
x = np.random.binomial(n, p, size)
print(x)
print(np.sum(x==0)/size)plt.hist(x)
plt.xlabel("随机变量:成功次数")
plt.ylabel("样本中出现的次数")
plt.show()s = stats.binom.pmf(range(10),n,p)
print(np.around(s,3))
[2 0 0 ... 0 0 2]
0.3904

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gk6Mkzx3-1606315239569)(output_1_1.png)]

[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(20201125)
n = 2
p = 0.5
size = 50000
x = np.random.binomial(n,p,size)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("随机变量:变量为正面次数")
plt.ylabel("50000个样本中出现的次数")
plt.show()s = stats.binom.pmf(range(n+1),n,p)
print(np.around(s,3))
0.25018
0.50046
0.24936

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKHoOxLt-1606315239571)(output_3_1.png)]

[0.25 0.5  0.25]

计算期望和方差

“”"
期望:E(x) = np

方差:Var(x) = np(1‐p)

利用stats.binom.stats(n, p, loc=0, moments=‘mv’)计算期望和方差

moments参数中:m为期望,v为方差
“”"

泊松分布

泊松分布主要用于估计某个时间段某事件发生的概率。

泊松概率函数的代码表示:poisson.pmf(k) = exp(-lam) lam*k / k!

泊松概率函数的数学表示:

  • 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 plt
np.random.seed(20200605)
lam = 42 / 6  # 平均值:平均每十分钟接到42/6次订票电话
size = 50000
x = np.random.poisson(lam, size)print(np.sum(x == 6) / size) # 0.14988
plt.hist(x)
plt.xlabel('随机变量:每十分钟接到订票电话的次数')
plt.ylabel('50000个样本中出现的次数')
plt.show()
# 用poisson.pmf(k, mu)求对应分布的概率:概率质量函数 (PMF)
x = stats.poisson.pmf(6, lam)
print(x) # 0.14900277967433773
0.14988

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nB0kY7of-1606315239573)(output_6_1.png)]

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 plt
np.random.seed(20200605)
size = 500000
x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)print(np.sum(x == 3) / size) # 0.198664
plt.hist(x, bins=8)
plt.xlabel('狗的数量')
plt.ylabel('50000个样本中出现的次数')
plt.title('超几何分布',fontsize=20)
plt.show()x = range(8)
#用hypergeom.pmf(k, M, n, N, loc)来计算k次成功的概率
s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12)
print(np.round(s, 3))
0.198664

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Izzi6wBk-1606315239574)(output_8_1.png)]

[0.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

‘’’
超几何分布的均值与方差

均值E(x) = N(n/M)

方差Var(x) = N(n/M)(1‐n/M)((M‐N)/(M‐1))

注释:考虑n次实验的超几何分布,令p=n/M,当总体容量足够大时((M‐N)/(M‐1))近似于1,此时数学期望为Np,方差为Np(1‐p).

#用stats(M, n, N, loc=0, moments=‘mv’)计算均值和方差

stats.hypergeom.stats(20,7,12,moments=‘mv’)
‘’’

连续型随机变量

均匀分布

  • 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, butexcludes high). In other words, any value within the given interval is equally likely to bedrawn by uniform .

【例】在low到high范围内,创建大小为size的均匀分布的随机数。

import numpy as np
import matplotlib.pyplot as plt
from scipy import statsnp.random.seed(20201125)
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)plt.hist(x, bins = 20)
plt.show()a = stats.uniform.cdf(10,0,100)
b = stats.uniform.cdf(50,0,100)
print(b-a)
True
True
0.40464

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViHdZr9m-1606315239575)(output_11_1.png)]

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 np
np.random.seed(20201125)
print(np.random.rand())print(np.random.rand(5))print(np.random.rand(4,3))np.random.seed(20201125)
print(np.random.uniform())
print(np.random.uniform(size=5))print(np.random.uniform(size=(4,3)))
0.8098159304646425
[0.03579724 0.20674657 0.94257697 0.62413889 0.01230949]
[[0.31290955 0.05072421 0.47959837][0.73333412 0.23161854 0.93494929][0.67984729 0.35497093 0.56270729][0.3101304  0.21993047 0.11158845]]
0.8098159304646425
[0.03579724 0.20674657 0.94257697 0.62413889 0.01230949]
[[0.31290955 0.05072421 0.47959837][0.73333412 0.23161854 0.93494929][0.67984729 0.35497093 0.56270729][0.3101304  0.21993047 0.11158845]]

作为uniform 的另一特例,可以得到[low,high) 之间均匀分布的随机整数。

  • numpy.random.randint(low, high=None, size=None, dtype=‘l’) Return random integers from low (inclusive) to high (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(20201125)
x = np.random.randint(2,size = 10)
print(x)x = np.random.randint(5, size =(2,4))
print(x)x = np.random.randint(1,10,[3,4])
print(x)
[1 1 1 1 1 0 0 1 1 0]
[[0 4 1 4][2 4 3 1]]
[[2 4 7 5][2 5 8 9][4 7 1 2]]

正态分布

标准正态分布数学表示:

  • 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(20201125)
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)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.68192
0.95412
0.99734

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bW4FIzfD-1606315239577)(output_17_1.png)]

0.6826894921370859
0.9544997361036416
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 plt
np.random.seed(20200614)
x = 0.5 * np.random.randn(2, 4) + 5print(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]]
[[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.4986846716715106(#样本标准差)
4.996403463175092
0.4986846716715106
plt.hist(x, bins=20)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23IE0XtK-1606315239578)(output_21_0.png)]

指数分布

指数分布描述时间发生的时间长度间隔。

指数分布的数学表示:

  • 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 stats
np.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.95056
plt.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
0.63218
0.86518
0.95056

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50zHUYYz-1606315239578)(output_23_1.png)]

0.6321205588285577
0.8646647167633873
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 np
np.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]
[2 0 1]
[3 2 3]
[3 0 2]
['pooh' 'rabbit' 'pooh' 'pooh' 'pooh']
[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 np
np.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]))
# None
x = np.arange(20).reshape((5, 4))
print(x)np.random.shuffle(x)
print(x)
[6 8 7 5 3 9 1 4 0 2]
None
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15][16 17 18 19]]
[[ 8  9 10 11][ 0  1  2  3][12 13 14 15][16 17 18 19][ 4  5  6  7]]
  • 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(20201125)
x = np.arange(10)
y = np.random.permutation(x)
print(y)print(np.random.permutation([1,4,9,12,15]))x = np.arange(20).reshape((5,4))
print(x)y = np.random.permutation(x)
print(y)
[7 2 4 5 0 1 9 6 8 3]
[15 12  9  1  4]
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15][16 17 18 19]]
[[ 0  1  2  3][16 17 18 19][ 8  9 10 11][ 4  5  6  7][12 13 14 15]]

Python:NumPy-随机抽样相关推荐

  1. dataframe,python,numpy 问题索引1

    # 找出只有赌场数据的账户 gp=data.groupby(['查询账号','场景标签'],as_index=True) tj=gp.size().reset_index()按查询账号和场景标签分组并 ...

  2. python numpy 欧氏距离

    python numpy 欧氏距离 import numpy as np a1 = np.arange(5) print(a1) [0 1 2 3 4] a2 = np.arange(5,10) pr ...

  3. Python Numpy多维数组.sum(axis=0/1/2...) 详解

    Python Numpy多维数组.sum(axis=0/1/2-) 详解 numpy中axis取值的说明 首先对numpy中axis取值进行说明:一维数组时axis=0,二维数组时axis=0,1,维 ...

  4. python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号;  而list区分元素用逗号

    python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号: 而list区分元素用逗号.而 numpy.array 的 ...

  5. python求向量函数的雅可比矩阵_在python Numpy中求向量和矩阵的范数实例

    np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=np.linalg.norm(x, ord=None, ...

  6. python numpy数组和one-hot编码相互转换

    a=[0,0,1,0,1,0,1]result=[] for i, x in enumerate(a):if x==1:result.append(i)print(result) python num ...

  7. python绘制灰度图片直方图-python – numpy图像中灰度值的直方图

    我将图像加载到numpy数组中,并希望在直方图中绘制其颜色值. import numpy as np from skimage import io from skimage import color ...

  8. python numpy库安装-Python Numpy库安装与基本操作示例

    本文实例讲述了Python Numpy库安装与基本操作.分享给大家供大家参考,具体如下: 概述 NumPy(Numeric Python)扩展包提供了数组功能,以及对数据进行快速处理的函数. NumP ...

  9. Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()的使用

    Python numpy函数hstack() vstack()stack()dstack()vsplit()concatenate()的使用 文章目录: 一. 一. Reference: 1.http ...

  10. Matlab和Python(Numpy,Scipy)与Lapack的关系

    说到数值计算,可能许多人都能立马想到Matlab.Matlab多年的持续影响力已经让它成为许多人心中科学计算的代名词.但它底层一个重要的库Lapack却很少有人知道. 而Python年龄比Matlab ...

最新文章

  1. YOLO 卷积层代码学习
  2. c语言strcpy错误,C语言中的Printf和Strcpy错误。
  3. 盘点大数据生态圈,那些繁花似锦的开源项目
  4. 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
  5. 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn
  6. 01 | 从神经元说起:数学篇
  7. Android IOS WebRTC 音视频开发总结(四一)-- QQ和webrtc打洞能力pk
  8. 蓝桥杯 ADV-205算法提高 拿糖果(动态规划)
  9. Windows游戏编程大师技巧笔记(一些基础)
  10. Codeforces Round #389 (Div. 2) 752E(二分答案)
  11. 三星android+l,高配原生安卓!移动定制版三星I9008L评测
  12. 基于python的图书管理系统设计与实现论文_图书馆管理系统的设计与实现毕业论文...
  13. java过滤器是用来干什么的_java过滤器有什么作用
  14. 源码实践指南!Mastering opencv Ch3 Markerless AR--UBUNTU下 opencv+opengl 运行
  15. 【自走棋】地图格子高亮效果
  16. WPCMS插件自动采集发布文章WordPress插件
  17. 【仿】阿里巴巴首页(未登录)
  18. nodejs完成从163邮箱发送邮件到qq邮箱
  19. Python编程从入门到实践 第十章:文件和异常 练习答案记录
  20. 基础——MCU的电源,复位和时钟系统(STM32为例)

热门文章

  1. 宇宙有新惊喜了吗?十亿光年外存在巨大的反物质喷泉?
  2. mysql分表动态扩展_小星星 的动态 - SegmentFault 思否
  3. UMLChina建模知识竞赛第3赛季第13轮:SysML和系统工程知识
  4. Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica
  5. 华为畅享10s值得买吗_华为畅享10s多少钱?值得入手么?
  6. 2.支付10s倒计时
  7. 使用JAVA对象和JSON相互转换问题
  8. Backup Exec Inventory 与Catalog的含义(转载)
  9. 触发器详解——(二)JK触发器
  10. js base64编码格式图片另存为下载