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).
- 安装
可以通过pip install -U PyBayes
安装。
如果失败可以考虑手动下载源码,自己安装。
安装过程中,Cython编译可能失败。使用下面的命令安装,可以避免Cython编译加速:
python ./setup.py --use-cython=no install
- 主要功能
Kalman filter, particle filter and marginalized particle filter
- 遇到的问题
在执行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):
- 简单实例
一维卡尔曼和简单界面
#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()