MATLAB加权重采样

时间:2014-11-23 18:12:32

标签: matlab sampling montecarlo

我正在编写一个粒子滤波器定位算法,作为定位飞越山脉的飞机的练习的一部分。

据我了解,这方面的步骤是: - 做一堆随机猜测 - 过滤掉不太可能的猜测(使用高斯假设检验和一些有关问题的已知信息) - 根据平面在该步骤中的移动量移动过滤点 - 重新采样,按移位点加权

我遇到的问题是重采样位 - 如何在MATLAB中执行加权重采样?

请告诉我是否有任何我应该澄清的事情!谢谢!

2 个答案:

答案 0 :(得分:1)

首先,你应该研究SIR(顺序重要性采样重新采样)粒子滤波器[PF](或顺序蒙特卡罗方法是它所知的另一个名称)。 我推荐Arnaud Doucet& Neil Gordon在实践中称之为#34;顺序蒙特卡罗方法"。它实际上包含了粒子滤波器的最新技术,并包含了PF各种风格实现的描述。

SIR-PF具有以下步骤:

  • 预测:根据您的状态方程和先前的粒子群将粒子传播到下一个离散时间实例,即x(t + 1)= f(x(t),w(t)):=其中x是a n个状态的向量,对于每个状态,你有N个状态的实现(粒子),例如。 x~ [N x n]
  • 更正:根据您对测量方程的估计,应该采用y(t + 1)= g(x(t + 1),v(t))的形式,其中x(t + 1)是你的国家粒子数量。您计算误差e(t)= y(t + 1) - y_m(t + 1)并根据似然函数对总体进行加权,该似然函数可以是,但不一定必须是正态分布。你现在将拥有一组权重,例如如果你有m"传感器"你将有一个加权矩阵W = [N×m],或者在简单的情况下,你将有一个[N×1]权重向量。 (记得规范权重)
  • 重新采样(条件):此步骤应基于条件,以避免粒子简并的陷阱(您应该研究),常见的条件是计算有效粒子群体大小" ;,:= 1 /(平方权重之和)即Neff = 1/sum(w1**2, w2**2, ...., wN**2)。如果Neff< 0.85 * N然后重新取样。
  • 重新采样:计算(标准化的)权重向量的CDF,即P = cumsum(W)并从均匀分布(r)生成随机样本,选择P(w)> P的第一个粒子。 = r,重复此操作,直到你有了N个CDF的实现,这将更频繁地从具有较高权重的粒子中采样,而不是那些不具有较高权重的粒子,从而有效地缩小粒子群。然后,您创建一组均匀加权的新权重,即wN = 1 / N

    function [weights,X_update] = Standardised_Resample(P,X)
        Neff = 1/(sum(P.^2)); % Test effective particle size
        P = P./sum(P) % Ensure particle weights are normalised
        if Neff < 0.85*size(P,1)
            N = size(P,1)
            X_update(N,1) = 0
            L = cumsum(P)
            for i = 1:N
                X_update(i) = X(find(rand <= L,1))
            end
            weights = ones(obj.N,1)*1./obj.N;
        else
            weights = P;
            X_update = X;
        end
    end
    
  • 估算:XEst = W(t + 1)* x(t + 1):=加权乘积产生时间t + 1的状态估计

冲洗并重复时间t + 2等。

注意:x(0/0)是随机分布为~N(x(0),Q(0))的N个样本的总体,其中x(0)是初始条件的估计[IC]和Q(0/0)是IC猜测的方差(不确定性)的估计

答案 1 :(得分:0)

不知道更多具体细节。我认为randsample是一个很好的起点。