数据拟合

来源:互联网 发布:淘宝照片大小是多少 编辑:程序博客网 时间:2024/04/30 08:41

假设对观测数据进行拟合,得到的拟合曲线为。将观测数据代入,得到,其和的偏差定义为

                                                                                             (1)

评价拟合结果好坏的函数称为指标函数

                                                                                      (2)

拟合函数在观测数据上总的偏差越小,说明拟合的越好,因此可以具体写成

                                                                       (3)

其中是加权系数,表示每个观测数据的重要程度。一般情况下,我们认为每个观测数据是等重要的。因此,上式可以简化为

                                                                                           (4)

其中偏差可以定义为

                                                                                            (5)

当p=0时,

当p=1时,

当p=2时,

。。。 

评价函数一般写成p范数的p次方

                                          (6)

求最优拟合函数的过程是在构成的空间上寻优的过程

                                                                                    (7)

对应的解是

                                                                  (8)

指标函数是一个以函数为自变量的函数。至此,这个问题是变分问题(至于说如何使用变分来求解,暂且压一压,以后再细说)。

 

假设拟合函数为

如何求出呢?,从p=2开始推导。

评价函数对求导(因为在的取值范围是连续的,且向量的是一个凸函数,至少是不凹的),

                                                                  (9)

                                                      (10)

时,,因此极值点为极小值点。

等价于

                                                                                            (11)

上式两边进行转置,得

                                                                                             (12)

X为列满秩矩阵,的逆矩阵存在。因此

                                                                                        (13)

                                                                             (14)

当p=0时,。该式表示,拟合直线穿过观测数据点越多越好。该方法对数据的分布以及其中掺杂的噪声比较敏感,解不稳定。该方法可能不能拟合出真实数据的曲线,而是拟合了噪声数据。

当p=1时,。评价函数导数不连续,求解不像二范数求解那么方便,因此很少使用,但在有些情况下,1范数拟合的曲线更好。

下面用一段代码,简单说明一下p范数对拟合结果的影响

[plain] view plaincopy
  1. <span style="font-size:14px;">lens=50;  
  2. b=50;  
  3.    
  4. x=1:lens;  
  5. y=2*x+b*randn(1,lens);  
  6.    
  7. x=[1 2 3 4 5];  
  8. y=[1 2 2 3 5];  
  9.    
  10. for k=1:200  
  11.     for b=1:200  
  12.         yk=(k-100)/10*x+(b-100)/10;  
  13.         d=y-yk;  
  14.         sign=ones(1,lens);  
  15.         sign(find(abs(d)<0.5))=0;  
  16.         err0(k,b)=sum(sign);  
  17.         err1(k,b)=sum(abs(d));  
  18.         err2(k,b)=sum(d.*d);  
  19.     end  
  20. end  
  21. figure(1)  
  22. mesh(err0)  
  23. figure(2)  
  24. mesh(err1)  
  25. figure(3)  
  26. mesh(err2)  
  27.    
  28. figure(4)  
  29. plot(x,y,'ro')  
  30. hold on  
  31.    
  32. [a1 a2]=min(err0);  
  33. [b1 b2]=min(a1);  
  34. ka0=(a2(b2)-100)/10;  
  35. ba0=(b2-100)/10;  
  36. yk0=ka0*x+ba0;  
  37. plot(x,yk0,'md')  
  38.    
  39.    
  40. [a1 a2]=min(err1);  
  41. [b1 b2]=min(a1);  
  42. ka1=(a2(b2)-100)/10;  
  43. ba1=(b2-100)/10;  
  44. yk1=ka1*x+ba1;  
  45. plot(x,yk1,'g+')  
  46.    
  47.    
  48. [a1 a2]=min(err2);  
  49. [b1 b2]=min(a1);  
  50. ka2=(a2(b2)-100)/10;  
  51. ba2=(b2-100)/10;  
  52. yk2=ka2*x+ba2;  
  53. plot(x,yk2,'bs')  
  54.    
  55.    
  56. e10=sum(abs(y-yk0))  
  57. e11=sum(abs(y-yk1))  
  58. e12=sum(abs(y-yk2))  
  59.    
  60. e20=sum((y-yk0).*(y-yk0))  
  61. e21=sum((y-yk1).*(y-yk1))  
  62. e22=sum((y-yk2).*(y-yk2))  
  63.    
  64. legend('data','L0','L1','L2')  
  65. hold off</span>  

这段代码首先生成一组数据(x,y),然后分别使用0、1和2范数进行拟合求解。搜索范围k=[-10,10],b=[-10,10]。在搜索空间中找到拟合误差最小的最小p乘解。

 

 


从评价函数的2范数出发,的解的形式中包含着复杂的矩阵运算关系,这其中应该蕴含着什么。让我们首先从一个简单的例子入手吧。

有a,b两个向量,b在a上的投影p可以写成投影长度x和a方向上单位向量的乘积

                                                                      (15)

往a方向上做投影的投影变换矩阵为

                                                                                               (16)

                                                                                                 (17)

向量b到向量a的距离等于e=b-p的模,垂直方向上的投影矩阵为

                                                                                            (18)

                                                           (19)

在数据拟合中,数据的个数远远多于未知数(待求解参数)的个数,因此这个方程不能得到精确解。我们需要找到距离Y最近的一个空间,将Y投影到该空间中。X的列向量构成的空间叫做列空间。该空间内的任意向量Xv都是X的列向量的线性组合得到,v就是组合系数。Y的近似解形如

                                                                                           (20)

近似解与Y之间的向量为

                                                                                        (21)

该向量垂直于X的列空间中的任意向量Xv,有

                                                                                         (22)

                                                                               (23)

因为v为任意向量,因此

                                                                                   (24)

(20)式两边同时左乘矩阵X的转置,将(24)式代入得到

                                                                                       (25)

解出

                                                                                  (26)

近似解

                                                                     (27)

Y在投影变换矩阵的作用下,投影到X的列空间上,投影后得到的向量为,误差向量,误差的大小为

投影矩阵从另外一个角度解释了最小二乘法,同时也是最小p(p>2)乘法的解释。我们发现,最小二乘法给出的解是近似解。误差的来源方方面面,比如系统偏差,观测误差,记录误差等等。这些因素之间是一个什么样的关系,线性的还是非线性的,一时半会儿说不清楚,我们偷个懒,将拟合问题重新形式化如下

                                                                                   (28)

我们要求的问题等价于

                                                                      (29)

搞工程的搞来搞去不经意的发现,当随机不可知的因素很多,独立随机试验的次数很大时,由这些随机因素造成的随机误差服从高斯分布。学术界的人按耐不住了,不能让搞工程的压下去,整出了一个中心极限定理,各种分布都会渐进服从高斯分布。

我们俗气一把,还是从高斯分布入手,假设误差 服从零均值高斯分布,即。为什么是零均值,因为我们不想估计出个没用的有偏的分布出来。这种零均值误差还有个很带感的名字,白噪声。对其进行傅里叶变换后,各个频率都有响应,也就是说这种噪声是由不同频率的噪声合成的。我们常见的由各个频率合成的事物就是白色的光。所以,按照国际惯例,这种噪声叫做白噪声。

另外一个假设是独立同分布,也就是每次实验都是独立的,但是服从的分布相同。

                                                                                 (30)

                                                                      (31)

令上式对的导数为零,又见。也就是说,最小二乘法的概率解释是,拟合误差服从零均值高斯分布,拟合直线通过均值点。

假设噪声服从形如,那么其解对应的就是最小p范数解。这种分布貌似就是指数族分布,当p=1时叫做拉普拉斯分布,p=2时就是大名鼎鼎的高斯分布。

通过上面的分析,我们可以察觉到,噪声的模型影响了最终的拟合结果。如果噪声是形如1范数的,那么用2范数的最小二乘法拟合出来的直线就存在偏差。如果噪声中有粗大误差,那么如果不能事先去除,拟合的结果很有可能拟合了噪声而没能拟合真实数据。从这个角度看,其实我们能够解决的问题还比较有限,因为我们对于噪声的认识还不够。

从p范数的角度出发,均值是误差形如2范数的解,中位数是误差形如1范数的解,众数是误差形如0范数的解。猜想,p阶矩就是误差形如p范数的解。

到这里,我丧心病狂的把凸优化,线性代数和概率论貌似完美的在数据拟合的框架下联系在了一起。从其反方向看,这些理论本来就是为了解决数据拟合而被提出来的。只是数学教学时,人为的把本来应该在一起的拆开了。


图中的数据在y=2x上加入了标准差为10的零均值高斯白噪声。使用上面推导的公式解出拟合曲线为

拟合误差的样本均值为0.abc%#%$^#e-13,样本标准差为9.44。同时,该拟合曲线通过样本的均值点 。

 

[plain] view plaincopy
  1. <span style="font-size:14px;">a=4;  
  2. b=10;  
  3. lens=100;  
  4.    
  5. x=1:lens;  
  6. y=zeros(1,lens);  
  7. y=2*x+b*randn(1,lens);  
  8.    
  9. X=[x;y]';  
  10.    
  11. Y0=zeros(lens,2);  
  12. Y1=zeros(lens,2);  
  13. Y2=zeros(lens,2);  
  14. Y3=zeros(lens,2);  
  15. pY=zeros(lens+10,2);  
  16.    
  17. A=zeros(lens,4);  
  18. V=zeros(lens,4);  
  19. D=zeros(lens,4);  
  20. pY1=zeros(lens+10,2);  
  21.    
  22. figure  
  23. for i=1:lens  
  24.     Y0(i,:)=X(i,:);  
  25.          
  26.     if i>3 && a>=4  
  27.        Y3(i,:)=Y0(i,:)-3*Y0(i-1,:)+3*Y0(i-2,:)-Y0(i-3,:);  
  28.     end  
  29.     if i>2 && a>=3  
  30.         Y2(i,:)=Y0(i,:)-2*Y0(i-1,:)+Y0(i-2,:);  
  31.     end  
  32.     if i>1 && a>=2  
  33.         Y1(i,:)=Y0(i,:)-Y0(i-1,:);  
  34.     end  
  35.      
  36.     pY(i+1,:)=Y0(i,:)+Y1(i,:)+0.5*Y2(i,:)+1/6*Y3(i,:);  
  37.      
  38.     if i<lens  
  39.         t=X(i+1,:)'*pinv(X(i,:)');  
  40.         pY1(i+2,:)=(t*X(i+1,:)')';  
  41.         [v d]=eig(t(1:2,1:2));  
  42.         A(i,:)=reshape(t,1,4);  
  43.         V(i,:)=reshape(v,1,4);  
  44.         D(i,:)=reshape(d,1,4);  
  45.     end  
  46. end  
  47.    
  48. X1=[ones(1,lens);x]';  
  49. beta=inv(X1'*X1)*X1'*y';  
  50. pY2=X1*beta;  
  51.    
  52. plot(x,y,'go')  
  53. hold on  
  54. plot(pY(a:lens,1),pY(a:lens,2),'r+');  
  55. plot(pY1(a:lens,1),pY1(a:lens,2),'bs');  
  56. plot(x,pY2,'mv');</span>  

上面的代码中pY是基于泰勒级数展开的近似估计,pY1是基于局部最小二乘估计,pY2是全局最小二乘估计。

说了这么多,我们原地踏步在一阶线性估计上,高阶怎么求解。改改X和就可以了。求解方法还是原来的配方,还是原来的味道。这里就不在多啰嗦了。

                                                                                        (32)

                                                                                                      (33)

给大家再拜上一记大杀器

                                                                  (34)

小伙伴们不要害怕,看一副卖萌的样子就知道这货是传说中的核函数。加权函数一块来的时候,更加凶残的公式也就来了

                                                                                (35)

从数据出发,我们总能对它们进行合适的解释,发现合适的模型,拟合出合适的曲线,并给出这种解释的好坏程度。到目前为止,我们对于数据拟合能够给出的最简洁的表达是

                                                     (36)

貌似我们可以满足的洗洗睡了,但是一个关键的问题是X的具体形式能不能由数据自己说出来,也就是说从无到有可不可能。此外,还有两个问题没有解决,如何在保证上式成立的同时将参数的空间最小化,也就说能够用线性拟合的不用二阶多项式拟合。第二个问题就是迭代拟合。现实情况中,我们接收到的数据往往是以时间序列的形式呈现的,那t时刻和t-1时刻的模型出现不一致时,怎么处理。



除了最小p乘,还有PCA



如图1所示,最小p乘法求得是,而真实值到拟合曲线的距离为。那么,对应的是什么样的数据分析呢?


图1 最小p乘法的使用的误差是。真实值到拟合曲线的距离为

假如存在拟合曲线,设直线方程为。真实值到该曲线的投影点为。p=2时,则两点之间的距离为

                                                                                                                 (37)

                                                                                                                 (38)

在直线上,同时。这两个条件构成如下方程组

                                                                                                 (39)

联立上述方程组求得

                                                                                               (40)

代入式(37)(38)得

                                                                                                  (41)

上式两边对b求偏导,令偏导数为零得

                                                                                          (42)

化简为

                                                                                                        (43)

                                                                                                   (44)

                                                                                                                 (45)

                                                                                                                 (46)

将式(45)(46)代入式(44)得

                                                                                                  (47)

                                                                                                             (48)

因此,该直线通过均值点,投影点可以改写为

                                                                                              (49)

其中e是直线方向的单位向量。将式(49)代入式(38)得

化简为

                                                                                                     (50)

其中。上式中等号右边的第二项是个常量,不影响I取得极值时对应的e,可以去掉。同时,我们假设e是单位向量,则。重写I如下

                                                                                                           (51)

上式两边对e求导得

                                                                                                               (52)

化简得

                                                                                                                              (53)

上式成立时,u取得最大值,I取得最小值。对上两边同时除以(n-1),得到数据矩阵的协方差矩阵。/(n-1)是协方差矩阵的特征值,e是对应的特征向量。上述推导过程可以较为简单的推广到m维空间。对特征值按降序排列,,其中m为数据变量的维度。对应着数据的主方向。经过特征向量矩阵的映射,将协方差矩阵投影为对角阵,变量之间的相关性被消除,而数据方差最大的方向就是主方向。

当计算出数据协方差矩阵的特征向量后,我们计算贡献率

                                                                                     (54)

求出

                                                                                              (55)

使用前个特征值和特征向量压缩原来的数据的表达空间,同时还能保证压缩后的数据矩阵损失最小。上述方法就是我们熟悉的PCA。

主方向线通过数据矩阵的均值点,这个点对应的是使用PCA做人脸识别时求出的均值脸。

总结一下PCA的推导过程,

1、去数据变量样本间的均值,并将该均值从数据矩阵中减去,得到零均值矩阵。

2、求零均值数据矩阵的协方差矩阵。

3、求协方差矩阵的特征向量和特征值。

4、按照一定的比例选择特征值和特征向量,实现降维。

 

上面推导的是线性关系的PCA,对于非线性的数据上面的方法可能会失效。解决方法,使用核函数将数据映射到高维再进行上述分析,这貌似就是kernel PCA。

同时,PCA分析的主方向通过数据的均值。而数据的均值很采样数据紧相关,如果数据中存在粗大误差,那么此时的均值不能反应真实的数据均值。如果不进行预处理,后续的PCA分析很可能会是错误的,达不到预期的效果。因此,对数据进行预处理是很必要的,剔除粗大误差后再进行PCA分析,貌似就是robust PCA。


在PCA推导的过程中,我们可以较为清晰地看到,如果将数据标签揉到推导中,修改优化的目标函数,我们应该能推导出SVM。因此,不同的误差定义,不同的优化目标函数推导出了不同的数据分析方法。无论这些怎么变换花样,其依托的数学思想都是一致的。

说到这里,我们差不多吧数据拟合相关的数据分析方法说了遍,但是说来说去关键问题还是没有触及,我们最关心最希望自动化的东西没有设计,那就是数据的模式,线性的还是非线性的,一阶的还是二阶的等等问题。因为,我们明明可以看到数据在图像上或者几何上呈现出了某种分布,但是却不能通过数学推导自动化的把它从数据中挖出来。

到底能不能是一个终极问题,这个系列的文章只能做个抛砖引玉,希望能够激发出大家的进一步迭代思考,也许这种模式对应的数学公式就在不远处。


Kalman滤波

数据拟合能够估计出数据变化的趋势,另外一个同等重要的应用是如何利用这一趋势,预测下一时刻数据可能的值。通俗点儿说,你观察苍蝇(蚊子,蜜蜂)飞了几秒,你也许会想“它下一个时刻可能在哪儿”,“呈现出什么样的状态”诸如此类的问题。预知未来这档子事儿对我们有一种不可抗拒的吸引力。别看我们预测的未来很近,但这对于实际应用有很大的帮助。比如减小解空间的范围,便于搜索。对于搜索问题,预测可以看成是对从当前状态到目标状态的启发评价函数。好吧,我承认我陷得太深了,都是复习人工智能搞得。扯得有点儿远了,继续说我们的主题,预测。

古人每遇到重大活动,都会卜上一卦。念几句咒语,抽个签,看看签释,心里大概对所问之事有了个谱儿。再比如,这几天你的左眼皮一直在跳,你想知道这是为什么,意味着什么。你跑去算了一卦。抽签的时候,你心里默念着是不是要捡到钱了等等,结果抽了一个上上签,说你要遇到好事儿。这几天眼皮跳”是你的观察数据。你想知道未来会发生什么”是我们想要预测的东西。抽签的时候你心里默念的话,签儿,签上的符号和某些事件的对应关系,这些都是预测的算法。虽然占卜的过程包含了观察,有预测算法,有预测结果,同时也有结果的方差范围等等。但是我们说这种预测是不科学的,因为预测算法不科学,因果关系不见得成立等等。那有没有科学的预测呢,让我们进入今天的话题,Kalman滤波。

假设这样一个场景,A先生使用遥控器控制一架四轴直升飞机F在一个空旷的场地上飞行。直升飞机F上有一个GPS模块,通过无线发射模块实时的将直升飞机F的位置发给计算终端CB先生在终端C上运行一个“打”直升飞机F的程序D。程序D根据终端C接收的GPS数据,指导一个虚拟的导弹E去跟踪直升飞机F,并试图将F“击落”。

A先生控制的直升飞机F飞行轨迹多变,很难被跟踪。同时,终端接收的GPS数据中还有噪声。B先生引导的导弹E燃料有限,因此不能长时间、频繁地机动。因此,B先生希望程序D要尽可能准的估计出F的位置,尽可能少机动,跟踪F并将其击落。

假如,A先生控制F急速攀升,如图1a。D得到的数据如图1b中的红色点。如果不进行预测,直接根据GPS数据控制E机动,E的运动轨迹如图1c,绿色的轨迹线。E很可能因燃料不足提前爆炸,而没有击中FB先生很希望D能够根据GPS数据计算出如图1d所示的轨迹(橙色的轨迹线),来引导E去追踪F。

 

a                        b                        c                        d

图1 a、被观测对象实际的运动轨迹;b、我们观测到的被观测对象的运动轨迹;

c、如果不滤波的话,预测的轨迹;d、滤波后的预测轨迹。

 假如A先生很狡猾,他控制F飞行,其飞行轨迹如图2所示。B先生深感压力巨大,如何才能有效的跟踪F,并将其击落呢。


图2 A先生控制的直升飞机F可能飞出的轨迹(终端C得到的GPS数据)。

颜色越深,获取数据的时间越早;反之,颜色越浅,获取时间越晚。

程序D根据终端C提供的GPS数据,估计F的位置(x,y),时间t的采样记为。使用前t个时刻的采样,估计,使得该估计满足,

                                                                                                 (1)

                                                                                              (2)

其中,为范数。公式(1)是对历史数据的平滑(smooth,filter),公式(2)是对未来数据的预测(predict)。求解的过程是数据模型的更新。正如绪论中讨论的那样,数据模型可以形式化为,

                                                                                                       

其中s为观测直接得到的数据,为观测数据的一阶微分或者偏微分,为二阶微分或者偏微分,省略的部分为更高阶的微分或者偏微分。假如模型的复杂度函数h和模型涉及的数据的阶数相关,阶数越小复杂度越小,阶数越高复杂度越高。估计需要满足的第三个公式是

                                                                                                    (3)

模型的复杂度控制就是正则化。

BD指导E跟踪F轨迹这一问题抽象为这样一个模型,其中涉及观察变量和状态变量。观察变量是终端C得到的GPS数据,状态变量是程序D用于估计F位置的。Ft-1是状态转移矩阵,描述F的运动模型。Gt-1是控制矩阵,是外控制变量。Ht是观测矩阵,描述观测和状态之间的关系。Wt-1和Vt是高斯白噪声,covariance分别是Q和R,假设其不随状态变量变化。

                                                                      (4)

                                                                                            (5)

Ft和Ht的如何确定的呢?我们首先插入一段广告。对于一个具有n阶导数的函数f,其在x处的泰勒展开为

                                  (6)

忽略2阶以上的项,取x=t,x0=t-1,则上式可以写成

                                                               (7)

对上式分别求1阶和2阶导数有

                                                                              (8)

                                                                                          (9)

用矩阵的形式重写公式(7)如下

                                                                      (10)

对于离散模型的,微分用差分近似表示,式(8)(9)改写为

                                                                                  (11)

                                                     (12)

                                                                   (13)

式(13)给出了要估计的函数、导数与观测数据之间的关系。

广告时间结束,言归正传Ft描述的是状态之间的关系。该关系受到运动学的基本关系式的约束。牛顿运动学定律可以使用式(10)表示。

如果,我们想实时更新状态变量的值,式(13)告诉我们,观测数据是如何影响状态变量的。如果不想实时更新,就可以仅用式(10)。

根据式(10),Ft和Ht的具体形式为

                                                                                     (14)

                                                                                          (15)

                                                                                    (16)

在t时刻,根据式(4)预测F的当前位置,根据式(5)得到终端C得到的GPS数据的预测值。使用t-1时刻的最优状态估计,代入式(4)得

                                           (17)

的covariance更新如下,其中covariance用P表示

                                          (18)

的covariance,的covariance。式(17)、(18)完成了预测,如何结合新的观测求解最优估计呢,继续往后看。t时刻的观测变量的预测

                                                                 (19)

观测变量的covariance

                                                                (20)

Kalman增益

                                                                       (21)

t时刻观测变量的真实值与预测值之间的残差

                                                                          (22)

t时刻观测变量的最优估计

                                                             (23)

其covariance的最优估计是

                                                          (24)

公式(17)-(24)可以使用图3解释(图3使用观测变量来表示,而没有具体描述状态变量的预测和寻优的过程)。公式(17)-(19)对应的是图3b,根据图3a的t-1时刻的最优估计预测t时刻的观测变量。公式(20)-(24)对应的是图3d,根据图3c的新观测变量计算最优状态变量和观测变量。

                              (25)

                                              (26)


首先根据状态转移模型计算状态值的预测,求得观测变量的预测值。然后获得新的观测变量。再结合观测变量和观测变量的预测值,求出状态和观测变量的最优估计值。下面给出的是t时刻最优估计的模型,依然是高斯的。

   

a                                  b                                  c                                  d

图3 F位置估计

 

Kalman Filter的matlab代码

[plain] view plaincopy
  1. % the data to estimate  
  2. lens=100;  
  3. a=2;  
  4. b=50;  
  5. x=1:lens;  
  6. y=a*x+b*randn(1,lens);  
  7. D=[x;y];  
  8.    
  9. % the number of the stateparamters  
  10. StateParamNum=4;  
  11. % the number of thecontrol parameters  
  12. ContrParamNum=2;  
  13. % the number of theobservation parameters  
  14. ObsevParamNum=2;  
  15. % the motion transitionmatrix  
  16. F=[1 0 1 0;0 1 0 1;0 0 1 0;0 00 1];  
  17. % the control matrix  
  18. G=[0.5 0;0 0.5;1 0;0 1];  
  19. % the observation matrix  
  20. H=[1 0 0 0;0 1 0 0];  
  21. % the state vector  
  22. X=zeros(StateParamNum,1);  
  23. X=[D(1,1);D(2,1);0.001;0.001];  
  24. % the control vector  
  25. U=0*randn(2,1);  
  26. % the observation vector  
  27. Z=zeros(ObsevParamNum,1);  
  28. % the covariance of thestate  
  29. P=eye(StateParamNum,StateParamNum);  
  30. P(1,1)=10;  
  31. P(2,2)=10;  
  32. P(3,3)=10;  
  33. P(4,4)=10;  
  34. % the covariance of thestate noise  
  35. q=eye(StateParamNum,StateParamNum);  
  36. q(1,1)=0.1;  
  37. q(2,2)=0.1;  
  38. q(3,3)=0.01;  
  39. q(4,4)=0.01;  
  40. % the covariance of theobserve noise  
  41. r=eye(ObsevParamNum,ObsevParamNum);  
  42. r(1,1)=10;  
  43. r(2,2)=10;  
  44. % the optimal estimationof the the state  
  45. Xf=zeros(StateParamNum,lens);  
  46. % the optimal estimationof the the observation  
  47. Zf=zeros(ObsevParamNum,lens);  
  48. V=zeros(ObsevParamNum,lens);  
  49. Pf=zeros(StateParamNum,lens);  
  50.    
  51. for i=1:lens  
  52.     % theestimation of the state in time t  
  53.     Xest=F*X+G*U;  
  54.     % thecovariance of the estimated state  
  55.     Pest=F*P*F'+q;  
  56.     % theestimation of the observation in time t  
  57.     Zest=H*Xest;  
  58.     % thecovariance of the estimated observation  
  59.     Sest=H*Pest*H'+r;  
  60.     % theKalman Gain  
  61.     K=Pest*H'*inv(Sest);  
  62.     % thedifference between estimation and observation  
  63.     v=D(:,i)-Zest;  
  64.     % theoptimal estimation of the state in time t  
  65.     X=Xest+K*v;  
  66.     % thecovariance of the optimal state  
  67.    P=(eye(StateParamNum,StateParamNum)-K*H)*Pest;  
  68.     % theoptimal estimation of the observation in time t  
  69.     Z=H*X;  
  70.      
  71.     Xf(:,i)=X;  
  72.     Zf(:,i)=Z;  
  73.     V(:,i)=v;  
  74.     Pf(:,i)=diag(P);  
  75. end  
  76.    
  77. figure(1)  
  78. hold on  
  79. colormax=lens+1;  
  80. c=(1:lens-1)/colormax;  
  81. c1=repmat(c,3,1);  
  82. c2=[ones(1,lens-1);repmat(c,2,1)];  
  83.    
  84. for i=1:lens-1  
  85.     plot(D(1,i:i+1),D(2,i:i+1),...  
  86.         'LineWidth',3,'Color',c1(:,i)');  
  87.     plot(Zf(1,i:i+1),Zf(2,i:i+1),'-+',...  
  88.         'LineWidth',1,'Color',[1 0 0]);  
  89. end  
  90. hold off  


         

a                                  b

图4 a、原始数据和滤波数据;b、拟合误差

上面这段代码中去掉了控制部分,调整q和r可以改善滤波的效果。

 

在上面的推导过程中,对Kalman滤波有以下几点认识

1、 模型是线性的,体现在公式(4)中;

2、 模型是高斯的,体现在公式(4)、(5)中;

3、式(4)中的F和G矩阵没有更新;

4、状态变量是根据设计者的知识给出的。

综合以上几点,Kalman滤波是一个预设的跟踪器,物体的运动模型,运动之间的关系都是给定的。

我们可以默认这些预设都是正确的,直接来用。但是,人作为第一发现者,是如何从数据中抽象出这些状态,如何从状态到状态的转移求得运动模型,这些都没有解决。如果,这个问题没有解决,我们将无法进入下一个螺旋上升的阶段。说到这里,我不得不怀疑这样一点——我们获得的所谓的运动模型,所谓的状态变量的内容,是不是某些非人类的文明灌输给我们的。如果是这样的,那么我们不可能发现螺旋上升的途径;如果不是这样,这些是我们自己发现的,那么我们就有办法重新发现“发现知识”的过程,指导我们进入下一个螺旋。



1 0
原创粉丝点击