21 feb 2018
Kalman filtering, also known as linear quadratic estimation (LQE), is an algorithm that uses a series of measurements observed over time, containing statistical noise and other inaccuracies, and produces estimates of unknown variables that tend to be more accurate than those based on a single measurement alone, by using Bayesian inference and estimating a joint probability distribution over the variables for each timeframe. The filter is named after Rudolf E. Kálmán, one of the primary developers of its theory.
The Kalman filter assumes that variables are random and Gaussian distributed. Each variable has a mean value \(\mu\), which is the center of the random distribution, and a variance \(\sigma^2\), which is the uncertainty.
Also Kalman filtering assume the error in the measurement to be known and to be constant.
\(\text{kalman gain} = KG = \frac{E_{EST}}{E_{EST} + E_{MEA}}\)
kalman.gain = current.estimate.error / ( current.estimate.error + current.measurement.error )
\[{EST}_t = {EST}_{t-1} + KG [MEA - {EST}_{t-1} ]\]
current.estimate = previous.estimate + kalman.gain * (measurement - previous.estimate)
\[E_{EST_t} = \frac{E_{MEA}E_{EST_{t-1}}}{E_{MEA}+E_{EST_{t-1}}} \Rightarrow [1-KG] E_{EST_{t-1}}\]
current.estimate.error = ( current.measurement.error * previous.error ) / ( current.measurement.error + previous.error )
current.estimate.error = (1 - kalman.gain) * previous.error
KalmanFilter <- function(current.estimate, current.estimate.error, current.measurement, current.measurement.error) { # Apply Kalman filter. Calculates new estimate # and error of estimation # # Args: # current.estimate : Current estimation of the variable of interest # current.estimate.error : Current error in the estimation # current.measurement : Measured value # current.measurement.error : Constant error of measurement instrument # # Returns: # updated.estimate : Updated estimate of variable of interest # updated.estimate.error : Updated error of the estimate # Calculate Kalman gain kalman.gain = current.estimate.error / ( current.estimate.error + current.measurement.error ) # Update estimate updated.estimate = current.estimate + kalman.gain * (current.measurement - current.estimate) # Update error in estimate updated.estimate.error = (1 - kalman.gain) * current.estimate.error # Create return list return( list(updated.estimate = updated.estimate, updated.estimate.error = updated.estimate.error) ) }
Use Kalman filter to estimate the true temperatur of 72 degrees F with error of 4.
current.measurement <- 75 current.measurement.error <- 4 current.estimate <- 68 current.estimate.error <- 2
KalmanFilter(current.estimate, current.estimate.error, current.measurement, current.measurement.error)
## $updated.estimate ## [1] 70.33333 ## ## $updated.estimate.error ## [1] 1.333333
current.estimate <- 15 current.estimate.error <- 1 current.measurement.error <- 2 mu.temp <- rep(c(15,20,25), each=20) sigma.temp <- rep(c(2,1,1), each=20) temperatures <- rnorm(length(mu.temp),mu.temp, sigma.temp) n <- length(temperatures) # Store results results <- data.frame(mu.temp, sigma.temp, temperatures, estimate = NA, error = NA) for (i in 1:n) { # Set current measurement current.measurement <- temperatures[i] # Store result results[i,c('estimate', 'error')] <- c(current.estimate, current.estimate.error) kalman.filter.results <- KalmanFilter(current.estimate, current.estimate.error, current.measurement, current.measurement.error) current.estimate <- kalman.filter.results$updated.estimate current.estimate.error <- kalman.filter.results$updated.estimate.error }
Method | Equation |
---|---|
Kalman gain | \(EST_t = EST_{t-1} + KG [MEA - EST_{t-1} ]\) |
Gradient descent | \(b_t = b_{t-1} + LR (Y - \hat{Y})\) |
Elo rating | \(\text{Rating}_t = \text{Rating}_{t-1} + K (S - \hat{S} )\) |