Calculate new mean and variance given priors
def update(m1, v1, m2, v2):
This will reduce the variance, increasing convidence of the estimate.
mean = (v2 * m1 + v1 * m2) / (v1 + v2)
var = 1 / (1 / v1 + 1 / v2)
return mean, var
Convolution of two gaussian distributions. Overall, this will increase the variance.
def predict(m1, v1, m2, v2):
mean = m1 + m2
var = v1 + v2
return mean, var
This is the same operation as above, but in multiple dimensions using numpy matrices.
from numpy import matrix, identity
Kalman filter implementation, see https://en.wikipedia.org/wiki/Kalman_filter
class Kalman(object):
dt = delta time
F = next state function
H = measurement function
R = measurement uncertainty
u = external motion
def __init__(self, dt, F, H, R, u):
self.dt = dt
self.F = F
self.H = H
self.R = R
self.u = u
x = initial state (location and velocity)
P = initial uncertainty
def filter(self, x, P, measurements):
(Credit to Sebastian Thrun for the matrix operations)
I = identity(P.shape)
for m in measurements:
Prediction step. Typically movement.
x = (self.F * x) + self.u
P = self.F * P * self.F.transpose()
Measurement update.
Z = matrix(m)
y = Z.transpose() - (self.H * x)
S = self.H * P * self.H.transpose() + self.R
K = P * self.H.transpose() * S.inverse()
x = x + (K * y)
P = (I - (K * self.H)) * P