matlab练习程序(无迹变换)

Posted Dsp Tian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab练习程序(无迹变换)相关的知识,希望对你有一定的参考价值。

当数据通过非线性函数后,分布不再是高斯分布时,可以用无迹变换估计新数据的均值与方差。

算法原理就是在原始数据均值周围根据方差选取一些待使用点,然后将这些点通过非线性函数,再通过加权平均的方式求出新分布的均值与方差。

如果我们选取的点非常多,并且将这些点都通过非线性函数,再估计均值与方差,那么就是粒子滤波了。

无迹变换的典型算法就是无迹卡尔曼滤波了,我这里只是单纯实验了无迹变换,没有涉及卡尔曼滤波部分,后面有时间应该会写无迹卡尔曼滤波。

无迹变换中选取加权的权重公式我看还挺复杂,并且我不是完全清楚其意义,所以这里直接暴力取权重了,对于实验数据效果还可以。 

matlab代码如下:

clear all;close all;clc;

% 非线性函数:
% xpar = x+y
% ypar = 5*x*x +y*y

x = randn(1000,1)*2;
y = randn(1000,1);

mu = [mean(x);mean(y)];
P = [x y]\'*[x y] / length(x);

plot(x,y,\'r.\')
hold on;
plot(mu(1),mu(2),\'b*\')

%%%%%%%%%%%%ut变换%%%%%%%%%%%%%%%%%%%%
n = 2;
N = 2*n+1;
Wm = ones(1, N) * 1/(2*(n+1));                      %这里比较暴力直接取权重
Wc = [Wm(1), Wm(2:end)+ones(1, 2*n)*1/(2*(n+1))];

%
alpha = 0.9;                  %根据公式算权重,需要仔细考虑各个系数
kappa = 2;
beta = 2;
lambda = alpha^2 * (n + kappa) - n;
Wm = zeros(1,2*n+1);
Wc = zeros(1,2*n+1);
Wm(1) = lambda / (n + lambda);
Wc(1) = Wm(1) + (1 - alpha^2 + beta);
for i = 2 : 2*n+1
    Wm(i) = 1 / (2 * (n + lambda));
    Wc(i) = Wm(i);
end
%

L = chol(P, \'lower\');
X = [mu, mu + sqrt(n+1)*L, mu - sqrt(n+1)*L];       %得到原始均值周围的点作为待处理点

Y = zeros(size(X));                                 %待处理点过非线性函数
for i = 1:N
    newx = X(1,i);
    newy = X(2,i);
    Y(1,i) = newx+newy;
    Y(2,i) = 5*newx.^2+newy.^2;
end

mu_hat = Y * Wm\';                                   %均值加权平均
P_hat = (Y - mu_hat) * diag(Wc) * (Y - mu_hat)\';    %方差加权平均

for i=1:N
  plot(X(1,i),X(2,i),\'bo\');
end
legend(\'原始数据点\',\'原始数据均值\',\'ut变换选取的待处理点\');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

xpar = x + y;                     %如果所有数据点都过非线性函数再求均值,那就是粒子滤波了
ypar = 5*x.^2+y.^2;

figure;
plot(xpar,ypar,\'r.\')
hold on;
plot(mean(xpar),mean(ypar),\'g*\')

xmean = mu(1) + mu(2);            %原始数据点的均值过非线性函数得到的新分布的均值是不对的
ymean = 5*mu(1).^2 + mu(2)^2;
plot(xmean,ymean,\'b*\');

for i=1:N
  plot(Y(1,i),Y(2,i),\'bo\');
end
plot(mu_hat(1),mu_hat(2),\'go\');

legend(\'非线性函数处理后的原始数据点\',\'非线性函数处理后的原始数据点的均值\', ...
\'原始数据点的均值过非线性函数后的值\',\'ut变换选取的待处理点过非线性函数后的值\',\'ut变换最终结果(应该是绿圈,算bug吗。。。)\');

结果如下:

以上是关于matlab练习程序(无迹变换)的主要内容,如果未能解决你的问题,请参考以下文章

机动目标跟踪—当前统计模型(CS模型)扩展卡尔曼滤波/无迹卡尔曼滤波 matlab实现

机动目标跟踪—当前统计模型(CS模型)扩展卡尔曼滤波/无迹卡尔曼滤波 matlab实现

机动目标跟踪—当前统计模型(CS模型)扩展卡尔曼滤波/无迹卡尔曼滤波 matlab实现

无迹卡尔曼滤波-1

滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现

应用霍夫变换方法,用matlab语言编写相应的程序