Numpy_02随机抽样

Numpy_随机抽样

参考博客:

hist.bins解释.
泊松分布理解.
指数分布理解.
plt.scatter(画点).
plt.plot(画线).

二项分布

random.binomial(n, p, size);
返回的是n次试验中事件A发生的次数;
Size表示做size次的n伯努利试验;
需要注意的是,size可以取(10, 3)等,相当于做10*3次实验,这样就会返回10行3列的矩阵,这个函数其实返回的是一个ndarray数组
array是一个数组,而ndarray是一个类对象;

np.array([1,2,3,4])

如:
在这里插入图片描述

import numpy as np

np.random.seed(20201124)
n = 3; p = 0.5;
size = 100001;
print(sum(np.random.binomial(n, p, size) == 1) / size)

在这里插入图片描述
stats.binom.pmf()
在这里插入图片描述

numpy.around(a, decimals=0, out=None)
参数解析:

   a为输入列表或矩阵;
   decimals为n对输入近似后保留小数点后n位,默认为0;
   若值为-n,则对小数点左边第n位近似;
   out为可选参数,一般不用,用于保存近似返回结果。

实例代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200605)
n = 9# 做某件事情的次数
p = 0.1# 做某件事情成功的概率
size = 50000
x = np.random.binomial(n, p, size)  #做size次n次伯努利实验
'''或者使用binom.rvs
#使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
'''
print(np.sum(x == 0) / size)  # 0.3897

plt.hist(x)
plt.xlabel('随机变量:成功次数')
plt.ylabel('样本中出现的次数')
plt.show()
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(10), n, p)    #得到k = 0~9的二项分布的结果
print(np.around(s, 3))     #对s这个序列中每位数字的小数点右边第3位进行近似计算
# [0.387 0.387 0.172 0.045 0.007 0.001 0.    0.    0.    0.   ]

在这里插入图片描述

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

np.random.seed(20200605)
n = 2# 做某件事情的次数,这里是投两次硬币
p = 0.5#做某件事情成功的概率,在这里即投硬币为正面的概率
size = 50000
x = np.random.binomial(n, p, size)
'''或者使用binom.rvs
#使用binom.rvs(n, p, size=1)函数模拟一个二项随机变量,可视化地表现概率
y = stats.binom.rvs(n, p, size=size)#返回一个numpy.ndarray
'''
print(np.sum(x == 0) / size)  # 0.25154
print(np.sum(x == 1) / size)  # 0.49874
print(np.sum(x == 2) / size)  # 0.24972

plt.hist(x)
plt.xlabel('随机变量:硬币为正面次数')
plt.ylabel('50000个样本中出现的次数')
plt.show()
#它返回一个列表,列表中每个元素表示随机变量中对应值的概率
s = stats.binom.pmf(range(n + 1), n, p)
print(np.around(s, 3))
# [0.25 0.5  0.25]
#期望和方差
ss = stats.binom.stats(n, p, loc=0, moments='mv')  #计算期望和方差,函数的用法
print(np.around(ss, 3));

泊松分布

泊松分布的理解:
我简单的说:这是一个卖馒头的故事;
准备多少个馒头,能使得第二天能够的收益最大,卖的多,剩的少;
解决这个问题,就需要预测第二天能够卖出去多少个馒头。
想要预测就需要用以前的样本去得到一个模型。
画出一个时间轴,将时间轴无限分小,设为n,每次只能卖出一个馒头,且设置相互独立,是卖出馒头为事件A,可以看出这是一个二项分布;关键在于求出时间A的概率,所以我们需要求出p;
期望u等于np,p = u / n, 我们可以将p替换后带入这个等式,等式经过多重运算,最后用lam代替u,我们居然就得到了一个和泊松分布一模一样的等式;
经过这样的运算,我知道了原来lam指的是一个平均值。
证明以后再补充。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

#首先设置种子
np.random.seed(20201124)
#设置size, lam
size = 5000; lam = 42 / 6;
#np.random.poisson(lam, size), stats.poisson.rvs(lam, size=size)
x = np.random.poisson(lam, size);
print(np.sum(x == 6) / size)

plt.hist(x)
plt.xlabel('随机变量:每10分钟接到订票电话的次数')
plt.ylabel('5000个样本中出现的次数')
plt.show()

#使用poisson.pmf(k, mu)来求对应的腹部密度:概率密度函数(pmf)
x = stats.poisson.pmf(6, lam)
print(x)

在这里插入图片描述

超几何分布

如果bins为整数值,则bins为柱子个数,根据数据的取值范围和柱子个数bins计算每个柱子的范围值,柱宽=(x.max()-x.min())/bins;
所以效果图运行出来的时候,直接看好像只有7个,其实这个是通过计算得到的。
如果bins取值为序列,则该序列给出每个柱子的范围值(即边缘)
但是这里出现了一个有趣的现象,当我们去取值bins的时候,往往要多取一个,因为若是主子数目为7, 我们就取7个的话,我们会发现只出现了6个柱子,原因很简单,因为从样本和计算是有误差的。

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)
'''或者
#用rvs(M, n, N, loc=0, size=1, random_state=None)模拟
x = stats.hypergeom.rvs(M=20,n=7,N=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()

"""
M 为总体容量
n 为总体中具有成功标志的元素的个数
N,k 表示抽取N个元素有k个是成功元素
"""
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.    0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

在这里插入图片描述

#均匀分布

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200614)
a = 0
b = 100
size = 50000
x = np.random.uniform(a, b, size=size)
print(np.all(x >= 0))  # True
print(np.all(x < 100))  # True  #np.all(x < tmp) 当x中所有数据都小于tmp返回True,否则返回False
y = (np.sum(x < 50) - np.sum(x < 10)) / size
print(y)  # 0.40144

plt.hist(x, bins=20)
plt.show()

a = stats.uniform.cdf(10, 0, 100) #0-100 的均匀分布得到P(x <= 10)
b = stats.uniform.cdf(50, 0, 100) #0-100 的均匀分布得到P(x <= 50)
print(b - a)  # 0.4

在这里插入图片描述
np.random.uniform() 不指定low 和 high,默认在[0, 1)
np.random.randint() 则可以取随机的整数

正态分布

在这里插入图片描述
np.random.randn()得到一个标准正态分布
np.random.normal(mu,sigma,size);mu:期望,sigma:标准差
mean() 函数定义:
numpy.mean(a, axis, dtype, out,keepdims )
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置值,对 mn 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1
n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

>>> a = np.array([[1, 2], [3, 4]])
>>> np.std(a) # 计算全局标准差
1.1180339887498949
>>> np.std(a, axis=0) # axis=0计算每一列的标准差
array([ 1.,  1.])
>>> np.std(a, axis=1) # 计算每一行的标准差
array([ 0.5,  0.5])

样例:通过两种不同的方式去得到相同期望和方差的正态分布,然后通过直接求生成的样本的平均值和方差来进行验证

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(20200614)
x = 0.5 * np.random.randn(2, 4) + 5
'''或者
#模拟10000个随机变量
x = 0.5*stats.norm.rvs(size=(2,4))+5
'''
print(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]]

size = 50000
x = np.random.normal(mu, sigma, size)

print(np.mean(x))  # 4.996403463175092
print(np.std(x, ddof=1))  # 0.4986846716715106(#样本标准差)
'''
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.
'''
plt.hist(x, bins=20)
plt.show()

在这里插入图片描述
在这里插入图片描述

指数分布

我们可以回到卖馒头问题;前面的泊松分布我们讨论的时候如何准备一定数量的馒头的个数是的收益尽可能的大;那现在我们讨论另一个问题,馒头卖出的时间间隔有着怎么样的规律;
以泊松分布来看,当我们的X取0的时候,就表示没有馒头卖出,通过泊松分布得到的这个概率其实就是没有卖出馒头超过一天的概率,那么没有卖出馒头小于一天的概率则为1减去他;
在这里插入图片描述
但是,有一个问题,我们这样进行计算,时间单位都是以一天为度量单位,所以为了普遍性,我们需要在lam前乘上一个t,这样就表示在任一时间单位下馒头卖出的个数;通过这个方式我们使得泊松分布的X为0,这样会得到P(Y > t) 和P(Y <= t)的概率;就相当于得到了:
在这里插入图片描述
设随机变量Y,有:
在这里插入图片描述

在这里插入图片描述
这样我们就得到了Y的累积分布函数:
在这里插入图片描述
求导后得到,Y的概率密度函数:
在这里插入图片描述
至此,我们就得到了卖出馒头的时间间隔Y 的概率密度函数,也称为 指数分布

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)
'''或者
#rvs(loc=0, scale=1/lam, size=size, random_state=None)模拟
'''
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)  #Y, 期望
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

在这里插入图片描述

随机从序列中获取元素

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

import numpy as np
# 从[0,10)随机选三个,可重复
np.random.seed(20200614)
x = np.random.choice(10, 3)
print(x)  # [2 0 1]
#从[0, 10]选三个,概率如p所示,可重复
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]
#从[0,10)选三个,不可重复,概率如p
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) #均匀分布,从[0,10)选3个整数
print(x)  # [2 0 1]

对数据集进行洗牌操作

数据一般都是按照采集顺序排列的,但是在机器学习中很多算法都要求数据之间相互独立,所以需要先对数据集进行洗牌操作。

numpy.random.shuffle(x) 

对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)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]]

np.random.shuffle(x)
print(x)
# [[ 4  5  6  7]
#  [ 0  1  2  3]
#  [ 8  9 10 11]
#  [16 17 18 19]
#  [12 13 14 15]]

permutation()函数的作用与shuffle()函数相同,可以打乱第0轴的数据,但是它不会改变原来的数组。

numpy.random.permutation(x)

练习

1.创建一个形为5×3的二维数组,以包含5到10之间的随机数。

import numpy as np

x = np.random.randint(5, 11, (5, 3))
print(x)

在这里插入图片描述

2.生成相应的数据

在这里插入图片描述
创建分别具有5000个数据的训练集(xi,y)和测试集(xi,y),其中xi在间隔(-10,10)上均匀随机分布。为了使回归问题“真实”,大的均匀噪声分布在[-0.2,0.2]已添加到所有训练样本中,同时测试数据保持无噪声。
在这里插入图片描述
画点:plt.scatter()
在这里插入图片描述

代码思路:
对于训练集,首先生成1500个均匀分布的点,这里可以使用uniform();接着按照函数继续使用uniform()生成带噪音的y;对于测试集,x和训练集一样去生成,y直接按照函数计算即可。(5000不太好看)
对于点,需要使用plt.scatter()函数;对于画线,需要使用plt.plot()函数。
代码:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(20201126)
#生成训练集数据及画出训练集的点
x_train = np.random.uniform(-10, 10, size=5000)
y_train = np.sin(x_train) / x_train + np.random.uniform(-0.2, 0.2, 5000)
plt.scatter(x_train, y_train, marker=".", s = 0.5)

#测试集
x_test = np.random.uniform(-10, 10, size=5000)
x_test = np.sort(x_test)
y_test = np.sin(x_test) / x_test
plt.plot(x_test, y_test, color="red")
plt.show()

在这里插入图片描述
注:
一开始刚拿到这个图的时候,我以为每一个x对应了多个y;但实际上并不是这样,只是因为size=5000,并且在设置的时候s=0.5,才导致了这种情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值