重要性采样是很是有意 思的一个方法。咱们首先须要明确,这个方法是基于采样的,也就是基于所谓的蒙特卡洛法(Monte Carlo)。蒙特卡洛法,自己是一个利用随机采样对一个目标函数作近似。例如求一个稀奇古怪的形状的面积,若是咱们没有一个解析的表达方法,那么怎么作 呢?蒙特卡洛法告诉咱们,你只要均匀的在一个包裹了这个形状的范围内随机撒点,并统计点在图形内的个数,那么当你撒的点不少的时候,面积能够近似为=(在 图形内的点的个数/总的点个数),当你撒的点足够多的时候,这个值就是面积。 这里假设咱们总有办法(至少要比找解析的面积公式简单)求出一个点是否在图形内。另外一个例子,若是你要求一个稀奇古怪的积分,没有解析办法怎么办?蒙特卡 洛法告诉你,一样,随机撒点,你必定能够知道f(xi)的值,那么这个积分的解能够表示为=(b-a)/点的个数*sigma[f(xi)],其中b,a 为积分的上下限。函数
好了,知道了蒙特卡洛法,下面来讲重要性采样的前提一些内容。post
不少问题里,咱们须要知道一个随机变量的指望 E(X),更多时候,咱们甚至须要知道关于X的某一个函数f(X)的指望E[f(X)]。问题来了,若是这个X的几率分布超级特么的复杂,你准备怎么作 呢?积分么?逐点求和么?听上去挺不现实的。这时蒙特卡洛法跑出来告诉你,来来来,咱只要按照你这个几率分布,随机的取一些样本点,再 sigma(p(xi)*f(xi))不就能够近似这个指望了么。但问题又来了,你怎么”按照这个几率分布“去撒点呢?spa
经典蒙特卡洛法是这 么作的,首先把这个几率分布写成累计几率分布的形式,就是从pdf写成cdf,而后在[0,1]上均匀取随机数(由于计算机只能取均匀随机数),假如咱们 取到了0.3,那么在cdf上cdf(x0)=0.3的点x0就是咱们依据上述几率分布取得的随机点。.net
举个具体例子吧,例如我想按照标准正态分布N(0,1)取10个随机数,那么我首先在[0,1]上按照均匀分布取10个点blog
0.4505 0.0838 0.2290 0.9133 0.1524 0.8258 0.5383 0.9961 0.0782 0.4427get
而后,我去找这些值在cdf上对应的x0,以下it
-0.1243 -1.3798 -0.7422 1.3616 -1.0263 0.9378 0.0963 2.6636 -1.4175 -0.1442模板
那么上述这些点,就是我按照正态分布取得的10个随机数。class
OK,你按照上述方法去找cdf吧。pdf
我若是这么说,你确定会疯掉。由于,若是几率分布都超级特么的复杂,累计几率分布岂不是会更特么不知道怎么求了!
而后,咱们开始了重要性采样的介绍。
让 咱们回顾一下指望的求法E(f(x))=sum( p(x) * f(x) ) dx。那么,如今咱们引入另外一个几率分布s(x),相比于p(x),s(x)是很是简单能找到cdf的。那么咱们变形一下E(f(x)) = sum( p(x) * f(x) / s(x) * s(x) ) dx ,再仔细看看,这个求f(x)的指望变成了,求在s(x)分布下,p(x)*f(x)/s(x)的指望。
重要性采样的关键就在这里,把对f(x)很差求的指望,变成了一个在另外一个分布下相对好求的指望。
这样,s(x)能找到cdf,那么就用上面提到的那个方法去采样,而后对应的,求出h(x0)=p(x0)*f(x0)/s(x0)的值,最后再sigma(s(xi)*h(xi))就能够近似E(f(x))了。
举 个例子:就上面那个求积分的问题,用重要性采样解释还能够有很好玩儿的内容。上面求积分时,咱们是用的均匀采样的方法,注意这个时候自变量X已经被咱们弄 成了随机变量,f(X)就是这个随机变量的函数。可是,你们可能会注意到这个问题:若是这个f(x)长的比较特别,例如是个高斯函数N(a,b^2),只 不过它的方差b特别的小,可是自变量范围特别大。这时的均匀采样,大多数点都会落在了几率很低的地方,落在a附近的点不多。这样,均匀随机采样法获得的期 望颇有可能会和真实值差得很是远。(唉,这个问题想不明白的画图,还想不明白的作实验)。那么,此时,若是咱们换一个几率,不用均匀采样法,用,例如说 N(a,b^2)分布,用上述方法重要性采样一下。那么落在a附近的点会超级的多,这样,获得的指望会很好的近似真实值。
固然,上面那个分 布是我随口说的,你们都但愿那个重要性采样的几率函数能够无限的逼近真实分布。但既然能表示真实分布,咱们就知道cdf了,谁还须要重要性采样呢?因此这 只是理论状况。实际上,通常你们用的方法都会根据具体的状况选择。我所见到的,大多都是利用某一种距离/类似度度量函数,而后把这些距离利用某种方法变换 成几率分布。这么说仍是太抽象,举例吧:
我有一个特定人的模板,我但愿在一个给定的区域内寻找这我的。那么粒子的状态就是位置坐标(x, y)和大小(w,h),每一个粒子的权重:
首先,求这个粒子的直方图,再和模板求一个距离,巴式距离啦,EMD啦,随你选。假设这个值为x。
而后,计算K*exp^(-alpha*x)。这个方法被称为likelihood map,就是说分数越小则几率越高,分数越大几率越低。反正K和alpha积分从0到正无穷的和是1就能够了。这样每一个点都有了一个几率值。
且慢,如今还不是几率值。全部粒子的和不是1,因此只能叫权重值。而后再归一化一下,就成为了几率值。
最后这个值就是咱们要找的s(x)。p(x),f(x),s(x)都有了,这样咱们就能够比较轻易的利用s(x)的分布撒点,求指望了。
固然,在不少文章里这些几率都是带着条件几率的,有的利用马尔科夫性,只和前一帧的状态以及观测相关,有的则写成和之前所有状态相关。可是原理基本是一致的。s(x)的选取也各不相同,具体问题具体分析了。