贝叶斯++常见问题解答

开源贝叶斯过滤类

迈克尔·史蒂文斯

贝叶斯++做卡尔曼滤波吗?

是的,在Bayes++中有许多卡尔曼滤波器的实现。贝叶斯++、卡尔曼滤波器和扩展卡尔曼滤波器(EKF)是由实施协方差过滤器方案。

Bayes++有多快?

非常快!取决于使用的过滤器方案。这个UD_过滤器是最小和最快的方案。加快速度的最好方法是致力于优化uBLAS的使用,并为您优化uBLAS本身编译器。

什么是“方案”?

“方案”是Bayes++中用于定义特定滤波器的数值实现。每个方案都基于状态的一些统计表示。不同的方案适用于这些统计数据使用了不同的数值技术。目标Bayes++将为Schemes提供通用接口,以便您可以选择选择使用哪个。

为什么我应该使用Bayes++?毕竟,在中编写卡尔曼滤波器Matlab并不太难。

对于一个简单的测试,这可能是真的。如果你曾经尝试过交易随着各种各样的数值故障和标准化需要处理不连续模型时,您会意识到更多的是实现卡尔曼滤波器,然后是一手线性的代数方程!

许多DIY卡尔曼滤波器实现都会失败保持矩阵的对称性。如果问题得到解决,他们通常使用数值不准确的算法即使结果不再有效,也会默默地继续运行感觉。矩阵是病态的!所有这些难题都有由Bayes++为您解决。

然而,Bayes++最强大的功能是它只是做事正确!它提供了一致的应用方法多种贝叶斯滤波技术。一旦您将代表一个问题的模型差异贝叶斯滤波技术。这些可能是简单的线性过滤器,如信息过滤器方案,甚至是粒子过滤器,如SIR_过滤器方案。

预测模型中的“噪声耦合”是什么意思?

预测模型用方差表示噪声q个和噪音“耦合”G公司.

这些共同代表了过程(预测)噪声。在这种情况下,流程模型是x(k+1)=f(x(k))+G.q(k)哪里q(k)高斯白噪声中有差异q个.

这导致对于线性情况的卡尔曼滤波器协方差更新:
X(k+1)=F.X(k)。F’+G.q.G’
这相当于
X(k+1)=F.X(k)。F'+Q(F’+Q)哪里Q=总质量G’

以下是以这种方式表示过程噪声的几个原因。a) 对于分解过滤器(例如UD_scheme),它的形式是完美的b) 相同的噪声通常会叠加到多个状态元素上。在这个如果q的大小小于x,并且G提供了一个物理上容易的解释q元素如何影响x。

如何找到绕过文档的方法?

介绍性和概念性信息可以在贝叶斯过滤类文档。这个Doxygen生成的文档提供了所有类和成员名称的完整引用,以及他们的关系。有关特定方案及其方式的信息工作正常,最好查看其单独的头文件。过滤器类标题贝叶斯Flt.hpp还提供有关使用和继承的类成员,如状态变量。

我优先考虑的是在Doxygen文档中显示此组件信息。

simpleExample.cpp输出my_filter.x<<my_filter。X<<结束
这意味着什么?

我的过滤器(_F)是类型为的变量未插入_方案。这是众多过滤器之一方案.在类层次结构中未插入_方案从filter类继承状态过滤器.此类定义成员变量x个X(X)前者是一个向量,存储估计状态。后者是一个矩阵,并存储估计的状态协方差。理解这些变量意味着花点时间阅读卡尔曼滤波教科书或网站是值得的。

我需要用C++编程才能使用Bayes++吗?

对!开发Bayes++是为了在C++。一本好的C++教科书将帮助您了解Bayes++的工作原理。没有必要先学习C语言编程。学习C不是很好地介绍了中使用的现代C++编程技术贝叶斯++。我推荐Deitel和Deitel,“C++:如何程序”,第二版,普伦蒂斯·霍尔,ISBN 0-13-528910-6。是一本优秀的初学者书籍;并包括许多有用的提示和对语言的透彻理解。

Bayes++是否稳定?

尽管在过去的两个版本中,Bayes++中添加了许多内容多年来,他们只是增加了实现的种类。Bayes++的界面现在已经达到了非常成熟的阶段,几乎没有或无需更改即可添加新方案。然而,请注意矩阵支持实现(命名空间中的任何内容Bayesian_filter_matrix)可能会更改以适应矩阵库变化。

web中包含的过滤方案的实现释放,均已通过标准距离角观测进行测试问题。我也在自己的工作中使用过滤方案世界各地的其他人。

PDF文件在哪里?

贝叶斯规则通常定义为概率密度功能。然而,PDF从未出现在Bayes++中。他们总是由他们的统计数据表示。这是有充分理由的用这样的函数在算法上几乎无法实现。然而,考虑到过滤器的假设,充分的统计数据,可以轻松操作以实现Bayes规则。这是至关重要的卡尔曼为线性系统开发的内容。

每个过滤方案都源自一个或多个虚拟基础表示所用统计信息的类。例如卡尔曼状态滤波器过滤器示例(_F)基类。

你推荐什么矩阵库?

Bayes++使用uBLAS公司全it矩阵、向量容器和线性代数库功能。uBLAS公司是较大的促进可移植的C++源库。uBLAS是一个优秀的基本线性代数库。界面和语法都很容易使用。提供了多种矩阵和向量容器以及基本线性代数操作的完整集合。实施和结构可以结合许多未来的增强功能和效率改进。我使用uBLAS的次数越多,我就越喜欢它!另请参阅我的上的注释有效uBLAS公司在Boost Wiki上。

uBLAS的荣誉归于Joerg Walter和Mathias Koch。非常感谢!

较早版本的Bayes++支持uBLAS和MTL公司矩阵模板库。MTL的未来版本也可能是Bayes++感兴趣。然而,目前没有任何公开消息所以我会等待结果。

原则上,当Bayes++已构建。这只需要新版本的matSubSup.hpp软件在Bayes++本身提供的之前找到。然而Bayes++广泛使用uBLAS语法,因此更改是重大任务。

Bayes++需要LAPACK库吗?
我收到链接错误,缺少“sgetrs_”、“dgetrf_”等,为什么?

通常Bayes++根本不需要LAPACK。这些功能是LAPACK线性代数库的一部分。

QR分解的LAPACK函数仅由信息_根_方案。因此,除非您使用此方案或uLA包.hpp直接使用不需要的接口功能LAPACK,不应该有任何链接问题。

如果您确实希望使用信息_根_方案那么您将需要与LAPACK链接。有几种方法这取决于您的需求和系统。如果您使用Linux发行版可能有LAPACK作为包提供。然后,您只需安装该软件包并添加-拉帕克-lg2c型链接选项。

如果你使用Windows,那么你必须自己做更多的事情。整个LAPACK库可从网址:www.netlib.org在里面源格式。查找CLAPACK,它是Fortran原版。不需要编译整个库,可以使用可以下载为单独的文件。

是否可以在编译时修复Bayes++类的大小?

否。方案和模型大小是在以下情况下指定的运行时变量类被构造。这很有道理,因为我们希望能够创建不同大小的模型和过滤器。当然这很重要用于SLAM等应用程序。

如果size是模板参数(因此在编译时固定)否则不同大小的相同类将具有不同类型。这将使它们难以储存在容器中将击败一些允许算法的多态属性可以根据组合的Scheme和Model类型轻松选择。

这样会更有效率吗?

是和否。对于每个不同的大小,编译器必须为那个例子。对于小尺寸(1、2、3和4),这是有意义的。对于更一般的尺寸,可能的不同代码版本的数量很快就会变得不可收拾。这会导致令人难以置信的代码膨胀和间接较慢的代码。

为什么不能为Bayes++类选择矩阵类型及其存储?

应该有一种方法,类允许您选择矩阵类型及其存储方法。例如,使用存储固定大小矩阵uBLAS bounded_array可以提高效率。

目前唯一的办法这样做是为了提供一种替代matSupSub.hpp软件收割台。这是丑陋且只允许您为整体选择矩阵实现应用程序。例如,我可以用稀疏矩阵编译和测试Bayes++。

这应该通过模板化所有类来完成!我决定不这样做有三个很好的理由:

  1. 编译速度很慢,调试也很神秘。我已经离开了矩阵库界面的模板化边界。也许用些未来C++编译系统这将改变!
  2. Scheme和Model类类型取决于这些实现细节。否则,相同的类将具有如上所述的不同类型,其大小由模板参数固定。
  3. 许多算法需要额外的矩阵数值运算。这个最好的实施这些与接口中的矩阵类型没有直接关系。这个必须公开这些实现细节,以便指定其类型。