Tengo una trayectoria de un objeto en un espacio 2D (una superficie). La trayectoria se da como una secuencia de (x,y)
coordenadas. Sé que mis medidas son ruidosas y, a veces, tengo valores atípicos evidentes. Entonces, quiero filtrar mis observaciones.
Hasta donde entendí el filtro de Kalman, hace exactamente lo que necesito. Entonces, trato de usarlo. Encontré una implementación de Python aquí . Y este es el ejemplo que proporciona la documentación:
from pykalman import KalmanFilter
import numpy as np
kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
measurements = np.asarray([[1,0], [0,0], [0,1]]) # 3 observations
kf = kf.em(measurements, n_iter=5)
(filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
(smoothed_state_means, smoothed_state_covariances) = kf.smooth(measurements)
Tengo algunos problemas con la interpretación de entrada y salida. Supongo que eso measurements
es exactamente lo que son mis medidas (coordenadas). Aunque estoy un poco confundido porque las medidas en el ejemplo son enteros.
También necesito proporcionar algunos transition_matrices
y observation_matrices
. ¿Qué valores debo poner allí? ¿Qué significan estas matrices?
Finalmente, ¿dónde puedo encontrar mi salida? Debería ser filtered_state_means
o smoothed_state_means
. Estas matrices tienen formas correctas (2, n_observations)
. Sin embargo, los valores en esta matriz están demasiado lejos de las coordenadas originales.
Entonces, ¿cómo usar este filtro de Kalman?
fuente
Respuestas:
Aquí hay un ejemplo de un filtro Kalman bidimensional que puede serle útil. Está en Python.
El vector de estado consta de cuatro variables: posición en la dirección x0, posición en la dirección x1, velocidad en la dirección x0 y velocidad en la dirección x1. Vea la línea comentada "x: estado inicial 4-tupla de ubicación y velocidad: (x0, x1, x0_dot, x1_dot)".
La matriz de transición de estado (F), que facilita la predicción del siguiente estado del sistema / objeto, combina los valores de estado y posición actuales para predecir la posición (es decir, x0 + x0_dot y x1 + x1_dot) y los valores de velocidad del estado actual para velocidad (es decir, x0_dot y x1_dot).
La matriz de medición (H) parece considerar solo la posición en las posiciones x0 y x1.
La matriz de ruido de movimiento (Q) se inicializa en una matriz de identidad de 4 por 4, mientras que el ruido de medición se establece en 0,0001.
Esperemos que este ejemplo le permita hacer que su código funcione.
fuente
El filtro Kalman es un filtro predictivo basado en modelos, por lo que una implementación correcta del filtro tendrá poco o ningún retraso de tiempo en la salida cuando se alimente con mediciones regulares en la entrada. Siempre es más sencillo implementar el filtro kalman directamente en lugar de usar bibliotecas porque el modelo no siempre es estático.
La forma en que funciona el filtro es que predice el valor actual en función del estado anterior utilizando una descripción matemática del proceso y luego corrige esa estimación en función de la medición actual del sensor. Por lo tanto, también es capaz de estimar el estado oculto (que no se mide) y otros parámetros que se utilizan en el modelo siempre que sus relaciones con el estado medido se definan en el modelo.
Le sugiero que estudie el filtro kalman con más detalle porque sin comprender el algoritmo es muy fácil cometer errores al intentar usar el filtro.
fuente