PyBayes的安装和使用

PyBayes 主页 文档

PyBayes is an object-oriented Python library for recursive Bayesian estimation (Bayesian filtering) that is convenient to use. Already implemented are Kalman filter, particle filter and marginalized particle filter, all built atop of a light framework of probability density functions. PyBayes can optionally use Cython for large speed gains (Cython build can be several times faster in some situations).

  1. 安装

可以通过pip install -U PyBayes安装。

如果失败可以考虑手动下载源码,自己安装。

安装过程中,Cython编译可能失败。使用下面的命令安装,可以避免Cython编译加速:

python ./setup.py --use-cython=no install

  1. 主要功能

Kalman filter, particle filter and marginalized particle filter

  1. 遇到的问题

在执行python pybayes.GaussPdf(np.array([0.0, 0.0]), np.array([[200.0, 0.0],[0.0, 200.0]]))时报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Anaconda\lib\site-packages\pybayes\pdfs.py", line 548, in __init__
    self._set_rv(mean.shape[0], rv)
  File "D:\Anaconda\lib\site-packages\pybayes\pdfs.py", line 418, in _set_rv
    return self._set_rvs(exp_shape, rv, 0, None)
  File "D:\Anaconda\lib\site-packages\pybayes\pdfs.py", line 379, in _set_rvs
    self.rv = RV(RVComp(exp_shape))  # create RV with one anonymous component
  File "D:\Anaconda\lib\site-packages\pybayes\pdfs.py", line 46, in __init__
    raise TypeError("dimension must be integer (int)")
TypeError: dimension must be integer (int)

应该是跟1.9版本的NumPy不太兼容,NumPy的shape([1,2,3])返回的是(3L,),是长整型,所以修改pybayes的...\lib\site-packages\pybayes\pdfs.py文件的45行:

#if not isinstance(dimension, int):
if not isinstance(dimension, long):
  1. 简单实例

一维卡尔曼和简单界面

#coding=utf8

import sys
from PySide.QtCore import *
from PySide.QtGui import *

import pybayes as pb
import numpy as np

_A=np.array([[1.]])
_C=np.array([[1.]]) 
_Q=np.array([[1.]])
_R=np.array([[1.]])
s_pdf=pb.GaussPdf(np.array([1.]), np.array([[1.]]))
kf=pb.KalmanFilter(A=_A,C=_C,Q=_Q,R=_R,state_pdf=s_pdf)
p=kf.posterior()

def update(x):
    kf.bayes(np.array([x]))
    return p.mean()[0],p.variance()[0]

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(320, 205)
        self.pushButton = QPushButton(Dialog)
        self.pushButton.setGeometry(QRect(210, 160, 75, 25))
        self.pushButton.setObjectName("pushButton")
        self.textBrowser = QTextBrowser(Dialog)
        self.textBrowser.setGeometry(QRect(10, 10, 300, 131))
        self.textBrowser.setObjectName("textBrowser")
        self.textEdit = QTextEdit(Dialog)
        self.textEdit.setGeometry(QRect(35, 160, 100, 25))
        self.textEdit.setObjectName("textEdit")

        self.retranslateUi(Dialog)
        QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QApplication.translate("Dialog", "卡尔曼滤波器", None, QApplication.UnicodeUTF8))
        self.pushButton.setText(QApplication.translate("Dialog", "更新", None, QApplication.UnicodeUTF8))

class MainUi(QDialog,Ui_Dialog):
    def __init__(self,parent = None):#parent默认为0
        super(MainUi,self).__init__(parent)#固定形式
        
        self.setupUi(self)
        self.connectSlot()
        
    def connectSlot(self):#连接逻辑和界面
        #self.textEdit.textChanged.connect(self.changeWord)#同步textEdit和textBrowser的内容
        self.pushButton.clicked.connect(self.changeWord)

    def clearText(self):
        self.textEdit.setText("")
    
    def changeWord(self):#更改textBrowse显示内容
        mean,var=update(float(self.textEdit.toPlainText()))
        _text = u"<font color = blue>滤波值:%f<br />方差:%f</font>"%(mean,var)
        self.textBrowser.setText(_text)

def main():
    app = QApplication(sys.argv)
    ui = MainUi()#没有给parent赋值
    ui.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
posted @ 2014-12-15 22:44  catmelo  阅读(787)  评论(0编辑  收藏  举报