{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 自适应滤波器 Adaptive Filtering\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 自适应滤波器想法很简单,就是在变化的时候,系统能够检查到变化,并能够紧跟着变化自己的参数从而适应这种变化。\n", "\n", " 具体的来思考,一般情况下我们在使用线性卡尔曼滤波器的时候,我们会发现当我们采用的阶次越高的时候,系统所能够描述的信息更多,因此更加能够收敛到准确解。但是,线性卡尔曼滤波器对于突变、对于非线性控制变化不够敏感,经常需要等到变化稳定下来一段时间后才能够再次收敛到准确解。究其原因,是因为线性卡尔曼滤波器对位置、过程不确定性都设置为一常量。这个常量适合于线性稳定的运行阶段,但是在变化的阶段,由于具有较小的不确定性,系统会固执的相信自己的预估值,而忽视测量值,从而使得滤波器偏离了准确值。\n", "\n", " 因此,这个时候我们可以想到状态预估计不确定性的表达式为:$\\bar P = FPF^T + Q$。那么,只要在状态轨迹变化时状态的不确定性系数被调大,系统就会更加相信测量值,随后当系统再稳定了,参数再被调回去即可。\n", " \n", " 于是,我们就有方法:Q增益法;P增益法。 \n", "\n", " 这两个方法本质上是一致的,只是增益的对象不同罢了。但是,对于P增益法,由于增益是加在P上的,这使得当前状态的不确定性与之前较早时刻的状态的不确定性几乎无关。因此,时常会看到,在这种滤波方法下,滤波器经历了变化后渐于稳定的时候却会有小幅的波动,因此也把这种方法称作\"Fading Memory Filter\"。\n", " \n", " The idea of the adaptive filter is simple, which is actually that when the state trajectory turns, the system can detect the change and can change its own parameters to adapt to the change.\n", "\n", "Specifically, when we use the linear Kalman filter, we will find that when the order we use is higher, the system can describe more information, so it can converge to the exact solution. However, the linear Kalman filter is not sensitive enough to shock and nonlinear changes, and it is often necessary to wait until the change has stabilized for a period of time before it can converge to the exact solution again. The reason is because the linear Kalman filter sets the position and process uncertainty to a constant. This constant is suitable for a linearly stable operating phase, but in the changing phase, due to the small uncertainty, the system will stubbornly believe in its own estimate and ignore the measured value, causing the filter to deviate from the exact value.\n", "\n", "Therefore, at this time we can think of the expression of state pre-estimation uncertainty:$\\bar P = FPF^T + Q$. Then, as long as the uncertainty coefficient of the state is increased when the state trajectory changes, the system will be more convinced of the measured value, and then when the system is stabilized again, the parameters can be recalled.\n", "\n", "So, we have methods: Q gain method; P gain method.\n", "\n", "These two methods are essentially identical, except that the objects of the gain are different. However, for the P-gain method, since the gain is added to P, this makes the uncertainty of the current state almost independent of the uncertainty of the state at the earlier time. Therefore, it is often seen that under this filtering method, the filter undergoes a change and then gradually stabilizes, but there is a small fluctuation, so this method is also called \"Fading Memory Filter\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 多模型自适应估计 Mutiple Mode Adaptive Estimation (MMAE)\n", "\n", "然而,无论这上述两个方法中那个方法,都会对测量的准确性较为依赖,如果测量不准确,变会产生较大偏离。因此,在使用时,我们通常还要对其再进行优化,从而有了MMAE方法,其作用在于,采用多个不同的线性卡尔曼滤波器进行耦合,按照一定的、具有修正能力的权重来配比输出最终滤波值。\n", "\n", "However, both of the above methods are more dependent on the accuracy of the measurement. If the measurement is not accurate, the change will cause a large deviation. Therefore, we have to optimize it again, so that the MMAE method is available. This method couples a number of different linear Kalman filters and outputs the final estimate according to the modifiable weights.\n", "\n", "Therefore, the Algorithm is expressed as : $x =\\sum_{i=1}^N x_i\\bar P_i$ \n", "\n", "where if we have N filters, we can compute the probability that filter i is correct in relation to the rest of the filters with:\n", "$$\\bar P_i = P_k^i = \\frac{L_k^i P_{k-1}^i}{\\sum_{j=1}^N L_k^j P_{k-1}^j}$$\n", "In the Designing Kalman Filters chapter we learned the *likelihood* function:\n", "$$ L = \\frac{1}{\\sqrt {2\\pi s}}exp(-\\frac{1}{2}y^TS^{-1}y)$$\n", "which tells us how likely a filter is to be performing optimally given the inputs. yy is the residual and SS is the system uncertainty (covariance in measurement space). This is just a Gaussian of the residual and the system uncertainty. A large residual will give a large uncertainty, and thus low likelihood that the measurement matches the filter's current state. We can use this to compute the probability that each filter is the best fit to the data. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 交互多模自适应估计 Interating Multiple Modes(IMME)\n", "\n", "紧接着,我们又会发现MMAE方法随着假设滤波器的增多将导致组合爆炸,这不利于计算。\n", "\n", "Then, we will find that the MMAE method will lead to a combined explosion with the increase of the assumed filter, which is not conducive to calculation.\n", "\n", "因此,我们又引入了IMME方法。这个方法的本质是针对某一个特定行为设置两三个线性卡尔曼滤波器来描述,这些滤波器彼此之间可以形成相互制约的关系。在实践过程中,自适应滤波器会选择一个合适的比例来采纳各个滤波器的估计值。\n", "\n", "Therefore, we have introduced the IMME method. The essence of this method is to describe two or three linear Kalman filters for a particular behavior. These filters can form a mutually constrained relationship with each other. In practice, the adaptive filter chooses an appropriate scale to take the estimates of the individual filters.\n", "\n", "在滤波器设计过程中,我们会把某个行为依据过程分为两面、三面等,从而建立相对应于每一方面的线性卡尔曼滤波器(两个、三个…),再进行混合。\n", "\n", "In the filter design process, we will divide a behavior according to the process into two sides, three sides, etc., to establish a linear Kalman filter (two, three...) corresponding to each side, and then mix them.\n", "\n", "**Algorithm:**\n", "- **Initialization**\n", " 1. 初始化某行为(状态)为第i面的概率为$\\mu _i = P(m_i\\mid z)$,将其组合为数组$ \\mu = [\\mu _1,\\mu _2,…,\\mu_n]$\n", " 2. 初始化概率转换矩阵,即表示认定行为(状态)为第i面时,实际为第j面的可能,ie:$M = \\left\\lgroup \\matrix{p & 1-p \\cr 1-q & q} \\right\\rgroup _{nXn}$\n", " > M_i_j表示:认定i发生时,可能实际上是j发生的概率\n", " 3. 初始化行为(状态)为第j面的全概率$\\bar C_j$\n", " > 即:实际j发生的概率\n", " 4. 初始化混合概率系数为:$w_{ij}$\n", " > 即:认定i发生,其实误判,实际j发生的概率\n", "- **Predicte(u)**\n", " 1. 由混合系数确定混合条件:\n", "$$ X_j^m = \\sum_iw_{ij}X_i$$\n", "$$ P_j^m = \\sum_iw_{ij}[(x^i- x_i^m)(x^i- x_i^m)^T + P_i]$$\n", " 2. 再得先验假设估计:\n", "$$ \\bar X_j = F_jX_j^m$$\n", "$$ \\bar P_j = F_jP_j^mF_j^T + Q_j$$\n", "- **Update(z)**\n", " 1. 更新$\\mu$\n", " $$\\mu_i = \\bar C_i * Likelihood(i)$$\n", ">``` python\n", " for i, f in enumerate(self.filters):\n", " f.update(z)\n", " self.likelihood[i] = f.likelihood\n", "```\n", " 2. 更新$\\bar C$\n", " $$\\bar C_j = \\sum_i \\mu_iM_{ij} = dot(\\mu,M)$$\n", " 3. 更新混合系数$w_{ij}$\n", " $$w_{ij} = \\frac{\\mu_iM_{ij}}{\\bar C_j}$$\n", " 4. 得估计值:\n", "$$ x = \\sum_j \\mu_j \\bar X_j$$\n", "$$ P = \\sum_j \\mu_j [(\\bar X_j - \\bar X)(\\bar X_j - \\bar X)^T + \\bar P_j]$$\n", "\n", "\n", "- **Initialization**\n", " 1. Initialization, the probability that a behavior (state) is the i-th side is $\\mu _i = P(m_i\\mid z)$, which is combined into an array:$ \\mu = [\\mu _1,\\mu _2,…,\\mu_n]$\n", " 2. Initializing the probability conversion matrix, where the actual j-th side is possible, when the asserted behavior (state) is the i-th surface, ie:$M = \\left\\lgroup \\matrix{p & 1-p \\cr 1-q & q} \\right\\rgroup _{nXn}$\n", " > M_i_j indicates : the probability that j may actually occur when i is determined to occur\n", " 3. Initialization, the full probability where the behavior is the j-th side:$\\bar C_j$\n", " > is: the probability that actually the j-th side occurs\n", " 4. Initialize the mixing probability coefficient to:$w_{ij}$\n", " > The probability that j-th side occurs actually when i-th side is considered to occur\n", "- **Predicte(u)**\n", " 1. Determination of mixing conditions by mixing coefficient:\n", "$$ X_j^m = \\sum_iw_{ij}X_i$$\n", "$$ P_j^m = \\sum_iw_{ij}[(x^i- x_i^m)(x^i- x_i^m)^T + P_i]$$\n", " 2. Prior estimate:\n", "$$ \\bar X_j = F_jX_j^m$$\n", "$$ \\bar P_j = F_jP_j^mF_j^T + Q_j$$\n", "- **Update(z)**\n", " 1. Update: $\\mu$\n", " $$\\mu_i = \\bar C_i * Likelihood(i)$$\n", ">``` python\n", " for i, f in enumerate(self.filters):\n", " f.update(z)\n", " self.likelihood[i] = f.likelihood\n", "```\n", "\n", " 2. Update: $\\bar C$\n", " $$\\bar C_j = \\sum_i \\mu_iM_{ij} = dot(\\mu,M)$$\n", " 3. Update: $w_{ij}$\n", " $$w_{ij} = \\frac{\\mu_iM_{ij}}{\\bar C_j}$$\n", " 4. estimation:\n", "$$ x = \\sum_j \\mu_j \\bar X_j$$\n", "$$ P = \\sum_j \\mu_j [(\\bar X_j - \\bar X)(\\bar X_j - \\bar X)^T + \\bar P_j]$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``` python\n", " def _compute_mixing_probabilities(self):\n", " \"\"\"\n", " Compute the mixing probability for each filter.\n", " \"\"\"\n", "\n", " self.cbar = dot(self.mu, self.M)\n", " for i in range(self.N):\n", " for j in range(self.N):\n", " self.omega[i, j] = (self.M[i, j]*self.mu[i]) / self.cbar[j]\n", "``` " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``` python\n", " def _compute_state_estimate(self):\n", " \"\"\"\n", " Computes the IMM's mixed state estimate from each filter using\n", " the the mode probability self.mu to weight the estimates.\n", " \"\"\"\n", " self.x.fill(0)\n", " for f, mu in zip(self.filters, self.mu):\n", " self.x += f.x * mu\n", "\n", " self.P.fill(0)\n", " for f, mu in zip(self.filters, self.mu):\n", " y = f.x - self.x\n", " self.P += mu * (outer(y, y) + f.P)\n", "``` " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``` python\n", " def predict(self, u=None):\n", " \"\"\"\n", " Predict next state (prior) using the IMM state propagation\n", " equations.\n", "\n", " Parameters\n", " ----------\n", "\n", " u : np.array, optional\n", " Control vector. If not `None`, it is multiplied by B\n", " to create the control input into the system.\n", " \"\"\"\n", "\n", " # compute mixed initial conditions\n", " xs, Ps = [], []\n", " for i, (f, w) in enumerate(zip(self.filters, self.omega.T)):\n", " x = zeros(self.x.shape)\n", " for kf, wj in zip(self.filters, w):\n", " x += kf.x * wj\n", " xs.append(x)\n", "\n", " P = zeros(self.P.shape)\n", " for kf, wj in zip(self.filters, w):\n", " y = kf.x - x\n", " P += wj * (outer(y, y) + kf.P)\n", " Ps.append(P)\n", "\n", " # compute each filter's prior using the mixed initial conditions\n", " for i, f in enumerate(self.filters):\n", " # propagate using the mixed state estimate and covariance\n", " f.x = xs[i].copy()\n", " f.P = Ps[i].copy()\n", " f.predict(u)\n", "\n", " # compute mixed IMM state and covariance and save posterior estimate\n", " self._compute_state_estimate()\n", " self.x_prior = self.x.copy()\n", " self.P_prior = self.P.copy()\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``` python\n", " def update(self, z):\n", " \"\"\"\n", " Add a new measurement (z) to the Kalman filter. If z is None, nothing\n", " is changed.\n", "\n", " Parameters\n", " ----------\n", "\n", " z : np.array\n", " measurement for this update.\n", " \"\"\"\n", "\n", " # run update on each filter, and save the likelihood\n", " for i, f in enumerate(self.filters):\n", " f.update(z)\n", " self.likelihood[i] = f.likelihood\n", "\n", " # update mode probabilities from total probability * likelihood\n", " self.mu = self.cbar * self.likelihood\n", " self.mu /= np.sum(self.mu) # normalize\n", "\n", " self._compute_mixing_probabilities()\n", "\n", " # compute mixed IMM state and covariance and save posterior estimate\n", " self._compute_state_estimate()\n", " self.x_post = self.x.copy()\n", " self.P_post = self.P.copy()\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "接下来看一个例题,消化一下" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nSaYAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "% matplotlib inline\n", "import copy\n", "import numpy as np\n", "from numpy.random import randn\n", "import matplotlib.pyplot as plt\n", "from filterpy.kalman import IMMEstimator,KalmanFilter\n", "from scipy.linalg import block_diag\n", "import kf_book.adaptive_internal as adaptive_internal\n", "\n", "N = 600\n", "dt = 1.\n", "track = adaptive_internal.turning_target(N) # 生成了一个前400个点为无加速运动点,而后有加速度运动点,其中track[:,0]&track[:1]为第一个滤波器\n", "\n", "dt2 = (dt**2)/2\n", "F = np.array([[1, dt, dt2],\n", " [0, 1, dt],\n", " [0, 0, 1]])\n", "q = np.array([[.05, .125, 1/6],\n", " [.125, 1/3, .5],\n", " [1/6, .5, 1]])*1.e-3\n", "\n", "# create noisy measurements\n", "zs = np.zeros((N, 2))\n", "r = 1\n", "for i in range(N):\n", " zs[i, 0] = track[i, 0] + randn()*r\n", " zs[i, 1] = track[i, 2] + randn()*r\n", "\n", "ca = KalmanFilter(dim_x=6, dim_z=2) \n", "ca.F = block_diag(F, F)\n", "ca.x = np.array([[2000., 0, 0, 10000, -15, 0]]).T\n", "ca.P *= 1.e-12\n", "ca.R *= r**2\n", "ca.Q = block_diag(q, q)\n", "ca.H = np.array([[1, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 0, 0]])\n", "\n", "# create identical filter, but with no process error\n", "cano = copy.deepcopy(ca) # 区别于copy.copy(),deepcopy是深层拷贝,即将拷贝对象内容完全拷贝,\n", " # 而当拷贝后的像发生无论深层还是浅层改变时,原像皆不变\n", "cano.Q *= 0\n", "\n", "filters = [ca, cano] # 由常速滤波cano与常加速滤波ca混合,生成混合滤波器\n", "\n", "mu = np.array([0.5, 0.5])\n", "M = np.array([[0.97, 0.03],\n", " [0.03, 0.97]]) # 描述,在测量后的情况下,行为分别为mode i的概率为mu;其行为描述准确性为M\n", "\n", "bank = IMMEstimator(filters, mu, M) # 由混合滤波器,生成交互多模估计器bank\n", "\n", "xs, probs = [], []\n", "cvxs, caxs = [], []\n", "for i, z in enumerate(zs):\n", " z = np.array([z]).T\n", " bank.update(z)\n", "\n", " xs.append(bank.x.copy()) # bank.x 生成滤波状态值\n", " cvxs.append(ca.x.copy())\n", " caxs.append(cano.x.copy())\n", " probs.append(bank.mu.copy())# bank.mu生成权值系数变换的描述,展现出那个filter占据了主导作用\n", "\n", "xs = np.array(xs)\n", "cvxs = np.array(cvxs)\n", "caxs = np.array(caxs)\n", "probs = np.array(probs)\n", "\n", "plt.subplot(121)\n", "plt.plot(xs[:, 0], xs[:, 3], 'k')\n", "plt.scatter(zs[:, 0], zs[:, 1], marker='+')\n", "\n", "plt.subplot(122)\n", "plt.plot(probs[:, 0])\n", "plt.plot(probs[:, 1])\n", "plt.ylim(-1.5, 1.5)\n", "plt.title('probability ratio p(cv)/p(ca)');\n", "\n", "plt.figure()\n", "plt.plot(range(N),zs[:,0]-xs[:,0,0])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }