采样之拒绝采样

注:本文中所有公式和思路来自于邹博先生的机器学习升级版,我只是为了加深记忆和理解写的本文。


第一次接触到采样这个词的时候我感觉别扭,因为觉得不是有现成的样本数据么,直接处理后喂给模型不就行了么干嘛要多此一举呢?

其实我们可以这样来理解采样:

采样时前提是我们已经确定一个系统(概率分布),但是不知道满足该分布背后的参数,然后我们根据这个概率分布从所有的样本中采样出n个样本,那么这n个样本必然也是满足这个概率分布,我们通过这些样本,将参数求出来。

我们都比较熟悉这样的方式:给定样本数据,然后通过优化极值来求得参数(SVM、logistic等),这是频率学派的做法,在贝叶斯学派中,会用到采样的方式求得参数,地位上采样和优化是对等的。


这次先介绍一种采样方法--拒绝采样

从字面上便知,拒绝采样:带拒绝的采样


解释:假定现在有一个分布p(z),但很遗憾,这个分布很复杂,我们不太容易直接按照p(z)分布采样,此时我们总是可以找到一个容易采样的分布q(z)(例:高斯分布),我们将q(z)乘以一个系数k总可以拉伸这个分布,将原分布p(z)完全覆盖掉,如下图蓝色的线。


这样的话我们就可以在这个q(z)中做均匀采样,如果满足p(z)则接受该样本,不满足就拒绝掉。


再举一个小例子,假如现在要想在单位圆内做均匀采样:

方法一:我们就可以在单位圆外边画一个外切正方形,做拒绝采样,从而得到圆内的均匀样本。

方法二

我们假设有两个从0到1的随机数,a,b。那么,我们另: r = a 
      theta = b * 2 * Pi 
上述随机点显然可以布满整个圆,但是并不是均匀分布的,简单略
实际上,通过inverse sampling method,我们可以计算出正确的生成算法,即 
      r = sqrt( a ) 
      theta = b * 2 * Pi 
上述算法就是满足要求的了,即可以在圆的内部均匀分布了


拒绝采样的过程和思路比较简单,但是也有个显然易见的问题,会有一部分样本被丢弃掉,效率上也会差一些。后边会介绍更多的采样方法。


单位圆内均匀采样摘自就不告诉你1111的文章


拒绝采样是蒙特卡洛方法中的一种采样技术,用于从不易直接采样的目标分布中抽取样本。在拒绝采样中,我们首先选择一个容易采样的建议分布,这个分布需要比目标分布更加“宽松”,即在目标分布的所有值上都有较高的概率值。然后,从建议分布中抽取样本,并根据一定的拒绝率来决定是否接受这个样本,以确保最终样本符合目标分布。 以下是一个简单的拒绝采样MATLAB代码示例,目标分布是指数分布,而建议分布是均匀分布: ```matlab % 参数设置 target_density = @(x) exp(-x); % 目标分布的概率密度函数 proposal_density = @(x) ones(size(x)); % 建议分布的概率密度函数,这里用均匀分布 proposal_support = [0, 10]; % 建议分布的支持范围 n = 1000; % 希望抽取的样本数量 % 拒绝采样 accepted_samples = []; while length(accepted_samples) < n % 从建议分布中抽取样本 proposal_samples = proposal_support(1) + (proposal_support(2) - proposal_support(1)) * rand(1, n); % 计算目标分布与建议分布的概率密度比值 ratio = target_density(proposal_samples) ./ proposal_density(proposal_samples); % 生成接受概率 accept_prob = min(ratio, 1); % 根据接受概率决定是否接受样本 accept = rand(1, n) < accept_prob; accepted_samples = [accepted_samples; proposal_samples(accept)]; end % 移除空行 accepted_samples = accepted_samples'; accepted_samples = accepted_samples(~isempty(accepted_samples), :); % 绘制结果 histogram(accepted_samples, 'Normalization', 'pdf'); hold on; f = @(x) target_density(x); x_values = linspace(min(accepted_samples), max(accepted_samples), 100); plot(x_values, f(x_values), 'r', 'LineWidth', 2); title('拒绝采样结果'); xlabel('样本值'); ylabel('概率密度'); legend('样本分布', '目标分布'); ``` 在这段代码中,我们首先定义了目标分布和建议分布的概率密度函数,然后通过循环从建议分布中抽取样本,并计算每个样本被接受的概率。如果样本被接受,就将其加入到最终样本集中。最后,我们绘制了样本的直方图和目标分布的曲线图,以可视化结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值