采样

参考文献

1.《百面机器学习》
2.《神经网络与深度学习》
3.Python中的两种随机数机制


在这里插入图片描述

1.对于采样的理解

采样法(Sampling Method),也叫 蒙特卡罗方法(Monte Carlo Method) 或统计模拟方法,是 20 世纪 40 年代中期提出的一种通过随机采样的方法来近似估计一些计算问题的数值解。
(1)采样本质上是对随机现象的模拟,采样可以让人们对随机事件及其产生过程有更直观的认识。
(2)另一方面,采样得到的样本集也可以看做是一种非参数模型,即用少量的样本点来近似总体分布,并刻画总体分布中的不确定性,因此从这一角度来说,采样也是一种信息降维,可以起到简化问题的作用。
典型示例:训练集、测试集


2.均匀分布随机数

首先明确,由计算机产生的随机数都是伪随机数,真正的随机数只存在于自然界的物理现象中(即人工的就是人工的)
由于计算机的存储和计算单元只能处理离散状态值,因此也不能产生连续均匀分布随机数,只能通过离散分布来逼近连续分布。
均匀分布随机数的产生方法———线性同余法
在这里插入图片描述
线性同余法的原理就是根据当前生成的随机数 xt 来进行适当变换,进而产生下一次的随机数据xt+1,初始值 x0 称为随机种子!(这里对应Python产生随机数中设置seed的由来,因为只有初始值一致,采用相同的产生公式才能复现出同一组随机值!!)
该方法最多可以产生m个不同的随机数,一个好的线性同余随机数生成器要使得其循环周期尽可能接近m,就需要精心选择乘法因子a和模数m。


3.常见的采样方法

背景: 前面一节我们知道均匀分布随机数一般用线性同余法来产生,而几乎所有的采样方法都是以均匀分布随机数作为基本操作,因此采样方法虽然多,但是都是以此为基础的。

3.1 均匀分布的扩展方法(轮盘赌)

最为典型的就是轮盘赌方法,该方法可以直接用均匀采样扩展而来,这里不再赘述;

3.2 函数变换法

在这里插入图片描述
3.2.1 拒绝采样(接受/拒绝采样)

方法思路: 假设原始分布 p(x) 难以直接采样,我们可以引入一个容易采样的分布 q(x),一般称为提议分布(Proposal Distribution),然后以某个标准来拒绝一部分的样本使得最终采集的样本服从分布 p(x)。
在拒绝采样中,已知未归一化的分布 pˆ(x),我们需要构建一个提议分布 q(x) 和一个常数 k,使得 kq(x) 可以覆盖函数 pˆ(x),即 kq(x) ≥ pˆ(x), ∀x。

在这里插入图片描述
在这里插入图片描述
衍生——自适应拒绝采样:
因为拒绝采样的关键是为目标分布 p(x) 选择一个合适的包络函数,包络函数越紧,则每次采样时样本被接收的概率越大,采样效率越高,但是我们知道,合适的包络函数是很难寻找的,因此我们衍生出了自适应拒绝采样,用分段线性函数来作为包络函数,尽可能贴近目标分布。

3.2.2 重要性采样

拒绝采样直接针对原始分布 p(x) 构建包络函数,这种做法是很直观的,但是很多时候,采样问题并不单纯是为了得到样本,而是为了进行一些后续任务,如预测变量取值,这一般表现为一个求函数期望的形式。
在这里插入图片描述
例如上面的是计算函数 f(x) 在目标分布 p(x) 上的积分(函数期望)。对于 目标分布p(x)我们是不知道的,因此需要找一个比较容易采样的参考分布 q(x) ,并令 w(x)=p(x)/q(x),其中 w(x)称为重要性权重,这样就有:
在这里插入图片描述
在这里插入图片描述
就是说可以先从参考分布 q(x) 中抽取N个样本,然后用上式11.50来估计 E[f] 这个要求的期望!!

3.2.3 马尔可夫链蒙特卡罗方法(MCMC)

背景: 在高维空间中,拒绝采样和重要性采样的效率随空间维数的增加而指数降低。 马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)方法是一种更好的采样方法,可以很容易地对高维变量进行采样。
基本思想: 针对待采样的目标分布 p(x),构造一个马尔科夫链,使得该马尔科夫链的平稳分布就是目标分布 p(x);然后从任何一个初始状态出发,沿着马尔科夫链进行状态转移,最终得到的状态转移序列会收敛到目标分布,由此可以得到目标分布的一系列样本。
核心问题: 如何构造合适的马尔科夫链,具体一些就是如何确定马尔科夫链的状态转移概率,并且该状态转移分布一般为比较容易采样的分布。

【1】Metropolis-Hastings 算法
在这里插入图片描述
算法步骤:
在这里插入图片描述

【2】吉布斯采样

吉布斯采样可以看作是 Metropolis-Hastings算法的特例,其使用全条件概率(Full Conditional Probability)作为提议分布来依次对每个维度进行采样,并设置接受率为 A = 1。
核心思想:每次只对样本的一个维度进行采样和更新
对于一个 M 维的随机向量 X = [X1, X2, · · · , XM]T,其第 i 个变量 Xi 的全条件概率为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



在这里插入图片描述

4.不均衡样本的重采样

背景:
之所以很多分类模型在训练数据不均衡时会出现问题,是因为模型在训练时优化的目标函数和人们在测试时使用的评价标准不一致,这种不一致可能是由于训练集和测试集的样本分布不一致,或者是训练阶段和测试阶段不同类别的权重不一致。

解决方法:

4.1基于数据的方法

过采样——从少数类样本集中随机重复抽取样本(有放回)以得到更多的样本;
优缺点:过采样对少数类样本进行了多次复制,扩大了数据规模,增加了模型训练的复杂度,但同时也容易造成过拟合;

欠采样——从多数类样本集中随机选取较少的样本(有放回或者无放回);
优缺点:欠采样会丢弃一些样本,可能会损失部分有用信息,造成模型只学到了整体模式的一部分;

4.2基于算法的方法

在样本不均衡时,可以通过改变模型训练时的目标函数(如代价敏感学习中不同类别有不同的权重)来矫正这种不平衡性。
当样本数目极其不均衡时,也可以将问题转化为单类学习、异常检测。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matplotlib是一个常用的Python可视化库,可以用于绘制各种类型的图形,包括折线图、散点图、柱状图等。要对数据进行采样,你可以使用NumPy库生成一些模拟数据,并使用Matplotlib进行绘制。 下面是一个简单的例子,展示如何在Matplotlib中进行采样: ```python import numpy as np import matplotlib.pyplot as plt # 生成随机的模拟数据 x = np.linspace(0, 10, 100) # 在0到10之间生成100个点 y = np.sin(x) # 对x进行正弦函数运算,得到y值 # 进行采样 sample_indices = np.random.choice(len(x), size=20, replace=False) # 从x的索引中选择20个不重复的随机数 sample_x = x[sample_indices] # 根据随机数的索引获取采样点的x值 sample_y = y[sample_indices] # 根据随机数的索引获取采样点的y值 # 绘制原始数据和采样数据 plt.plot(x, y, label='Original Data') # 绘制原始数据曲线 plt.scatter(sample_x, sample_y, color='red', label='Sampled Data') # 绘制采样数据点 plt.legend() # 显示图例 plt.show() # 显示图形 ``` 这段代码中,首先使用`np.linspace()`函数生成了一个包含100个点的等差数列作为x轴的取值范围。然后,通过对x进行正弦函数运算,得到了对应的y值。接下来,使用`np.random.choice()`函数从x的索引中选择20个不重复的随机数,作为采样点的索引。最后,使用`plt.plot()`函数绘制原始数据曲线,使用`plt.scatter()`函数绘制采样数据点,并使用`plt.legend()`和`plt.show()`函数显示图例和图形。 你可以根据自己的需求修改代码,进行不同类型的采样和绘制。希望这个例子对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值