24 votos

¿Por qué utilizar un filtro de Kalman en lugar de mantener un promedio de ejecución

He estado tratando de entender filtros Kalman. Aquí hay algunos ejemplos que me han ayudado hasta el momento:

Estos utilizan el algoritmo para estimar algunos de voltaje constante. ¿Cómo podría el uso de un filtro de Kalman para este ser mejor que mantener un promedio de ejecución? Son estos ejemplos de la simplificación de los casos de uso del filtro?

(Si es así, ¿cuál es un ejemplo donde un promedio de ejecución no es suficiente?)

EDITAR:

Por ejemplo, considere el siguiente programa de Java y de salida. El Tee de salida no coincide con el promedio, pero están muy cerca. ¿Por qué escoger uno sobre el otro?

int N = 10; // Number of measurements

// measurements with mean = .5, sigma = .1;
double z[] = 
{   
    0, // place holder to start indexes at 1
    0.3708435, 0.4985331, 0.4652121, 0.6829262, 0.5011293, 
    0.3867151, 0.6391352, 0.5533676, 0.4013915, 0.5864200
};

double Q = .000001, // Process variance
    R = .1*.1;// Estimation variance

double[] xhat = new double[N+1],// estimated true value (posteri)
xhat_prime = new double[N+1],   // estimated true value (priori)
p = new double[N+1],    // estimated error (posteri)
p_prime = new double[N+1],// estimated error (priori)
k = new double[N+1];    // kalman gain

double cur_ave = 0;

// Initial guesses
xhat[0] = 0; 
p[0] = 1;

for(int i = 1; i <= N; i++) {
    // time update
    xhat_prime[i] = xhat[i-1];
    p_prime[i] = p[i-1] + Q;

    // measurement update
    k[i] = p_prime[i]/(p_prime[i] + R);
    xhat[i] = xhat_prime[i] + k[i]*(z[i] - xhat_prime[i]);
    p[i] = (1-k[i])*p_prime[i];

    // calculate running average
    cur_ave = (cur_ave*(i-1) + z[i])/((double)i);

    System.out.printf("%d\t%04f\t%04f\t%04f\n", i, z[i], xhat[i], cur_ave);
}

salida:

 Iter      Input      Kalman     Average
    1   0.370844    0.367172    0.370844
    2   0.498533    0.432529    0.434688
    3   0.465212    0.443389    0.444863
    4   0.682926    0.503145    0.504379
    5   0.501129    0.502742    0.503729
    6   0.386715    0.483419    0.484227
    7   0.639135    0.505661    0.506356
    8   0.553368    0.511628    0.512233
    9   0.401392    0.499365    0.499917
    10  0.586420    0.508087    0.508567

16voto

vegan3rd Puntos 31

SÍ, es la simplificación de ejemplo, más engañoso que educar.

Si es así, ¿cuál es un ejemplo donde un promedio de ejecución no es suficiente?

En cualquier caso, cuando la señal está cambiando.

Imaginar vehículo en movimiento. Calcular la media significa que asumimos valor de la señal de cualquier momento en el tiempo para ser igual de importante. Obviamente está mal. La intuición dice, que la última medición es más fiable que el de una hora antes.

Un ejemplo muy bueno para experimentar con el formato $\frac{1}{sT + 1}$. Tiene un estado, por lo que las ecuaciones no complicarse.

En tiempo discreto se podría parecer a esto:

x[n] = Ax[n-1] + Bu[n] + w[n]
y[n] = Cx[n] + v[n]
A = 0.99    B=1     C=1

Ahí está el código que utiliza (lo siento, es Matlab, yo no lo uso Python recientemente):

%% Initialize space
N = 100;               % nr of iterations
x = zeros(N,1);
u = zeros(N,1);
yv = zeros(N,1);

xprio = zeros(N,1); % a-priori     xk|k-1
xpost = zeros(N,1); % a-posteriori xk|k
Pprio = zeros(N,1);
Ppost = zeros(N,1);
K = zeros(N,1);

%------------------------ Variables to play with:
modelError = -0.04;     % relative model error
Q = 0.01;               % std. deviation of disturbance
R = 0.1;                % std. deviation of measurement noise
x(1) = 0.5;             % initial state of plant
xpost(1) = 1;           % initial estimate (state of Kalman filter)
Ppost(1) = 0.001;       % initial error estimate (state of Kalman filter)
%------------------------

% Plant
Areal = 0.99;
B = 1;
C = 1;
% Model of plant
Amodel = Areal*(1+modelError); % model never describes reality perfectly

% Generate noise
w = Q*randn(N,1);
v = R*randn(N,1);

%% Iterate
for k = 2:N
    % simulate plant
    x(k) = Areal*x(k-1) + B*u(k-1) + w(k);
    % measurement
    yv(k) = C*x(k) + v(k);

    % prediction: predict current state from previous state and control
    xprio(k) = Amodel*xpost(k-1)+B*u(k-1);
    Pprio(k) = Amodel*Ppost(k-1)*Amodel' + Q;

    % correction: use measurements with proper weight (K)
    K(k) = Pprio(k)*C * inv(C*Pprio(k)*C' + R);
    xpost(k) = xprio(k) + K(k)*(yv(k) - C*xprio(k));
    Ppost(k) = (1 - K(k)*C)*Pprio(k);
end

%% Plot results
figure;
subplot(2,1,1);
plot(x,'k');
hold
plot(yv,'kx');
plot(xpost,'r');
legend('x real','x measure','x estimated');

% Important to see how K changes with time
subplot(2,1,2);
plot(K,'b')
legend('K');

Hay algunos consejos:

  • Establezca siempre Q y R mayor que cero.
    Caso $Q = 0$ es MUY MAL ejemplo. Usted dice que el filtro: "no hay ninguna perturbación que actúa sobre la planta", por lo que después de un tiempo el filtro creencia de que sólo a sus predicciones basadas en el modelo en lugar de buscar en las mediciones. Matemáticamente $K_k \to 0$. Como sabemos que los modelos no describen la realidad a la perfección.
  • Experimento con algunos modelos de la inexactitud - modelError
  • Cambio de estimación inicial del estado (xpost(1)) y ver qué tan rápido se converge para diferentes Q, R, y la inicial Ppost(1)
  • Compruebe que el filtro de la ganancia K cambia a través del tiempo dependiendo de Q y R

15voto

Wangyan Li Puntos 132

De hecho, son la misma cosa en cierto sentido, me va a mostrar su algo detrás del filtro de Kalman y usted se sorprenderá.

Considere el siguiente más simple problema de la estimación. Se nos da una serie de medición $z_1, z_2, \cdots, z_k$, de un desconocido constante $x$. Asumimos que el modelo aditivo \begin{eqnarray} z_i= x + v_i, \; i=1,2, \cdots, k ~~~~~~~~~~~ (1) \end{eqnarray} donde $v_i$ son de medición de ruidos. Si no se sabe nada mas, entonces todo el mundo estará de acuerdo en que una estimación razonable de $x$ $k$ de las mediciones puede ser dada por \begin{eqnarray} \hat{x}_k= \frac{1}{k} \sum_{i=1}^{k} z_i ~~~~~~~~~~~ ~~~~~~~~~~~ (2) \end{eqnarray} este es el promedio.

Ahora podemos volver a escribir encima de eq.(2) por la simple manipulación algebraica para obtener \begin{eqnarray} \hat{x}_k= \hat{x}_{k-1} + \frac{1}{k} (z_k-\hat{x}_{k-1}) ~~~~~~~~~~~ (3) \end{eqnarray} Eq.(3) que es simplemente Eq.(2) expresado en forma recursiva tiene una interpretación interesante. Se dice que la mejor estimación de $x$ después $k$ medición es la mejor estimación de $x$ después $k-1$ mediciones de más de un término de corrección. El término de corrección es la diferencia entre lo que usted espera que a medida basada en el $k-1$ medición, es decir, y de lo que realmente miden $z_k$.

Si la etiqueta de la corrección de la $\frac{1}{k}$$P_k$, entonces de nuevo, simplemente manipulación algebraica puede escribir de la forma recursiva de $P_k$ \begin{eqnarray} P_k=P_{k-1}-P_{k-1}(P_{k-1}+1)^{-1}P_{k-1} ~~~~~~~~~~~ (4) \end{eqnarray}

Lo creas o no, Ecualizadores.(3-4) puede ser reconocido como el filtrado de Kalman ecuaciones para este caso simple.

Cualquier discusión es bienvenida.

Referencia:

Explicando Filtrado (Estimación) en Una Hora, Diez Minutos, Un Minuto, y Una Oración por Yu-Chi Ho

6voto

Stephan Aßmus Puntos 16

Para darle un poco de sabor, consulte esta lista de libros:

http://www.cs.unc.edu/~welch/kalman/kalmanBooks.html

He Grewal+Andrews con MatLab, también Grewal+Weill+Andrews sobre el GPS.

Ese es el ejemplo fundamental, GPS. Aquí es un ejemplo simplificado, tuve una entrevista para un trabajo en el que estaban escribiendo software para hacer el seguimiento de todos los camiones que entran y salen de una enorme entrega patio, Walmart o similares. Habían dos tipos de información: se basa en colocar un dispositivo RFID en cada camión, que tenía muy buena información sobre la dirección de cada camión iba con posibles las mediciones muchas veces por segundo, pero finalmente creciente en el error, como lo hace cualquier esencialmente ODE aproximación. En una escala de tiempo mucho mayor, que podría adoptar la posición GPS de un camión, que le da una muy buena imparcial lugar, pero tiene una gran varianza, se obtiene la posición dentro de los 100 metros o algo así. Cómo combinar estas? Ese es el principal uso del filtro de Kalman, cuando se tienen dos fuentes de información, dando aproximadamente opuesto tipos de error. Mi idea, que me lo habría dicho si le habían pagado a mí, iba a colocar un dispositivo en cada semi donde la cabina cumple con el trailer, dando a conocer el radio de giro. Esto podría haber sido integrado para dar un muy buen corto de tiempo la información acerca de la dirección en la que el camión se dirigía.

Bueno, eso es lo que hacen con casi cualquier cosa en movimiento hoy en día. El que yo pensaba que era lindo fue granjas en la India, seguir la pista de dónde tractores fueron. El cuerpo en movimiento no necesita estar moviéndose rápidamente para traer sobre las mismas preguntas. Pero, por supuesto, el uso principal fue el Apolo de la NASA del proyecto...Mi padre se reunió Kalman en algún momento. Papá trabajaba principalmente en la navegación, inicialmente misiles para el Ejército, después de submarinos para la Armada.

3voto

Shabaz Puntos 403

Un promedio de ejecución es un tipo de filtro de Kalman. Siguiendo la notación en su primer enlace $\hat{X}_k=K_kZ_k+(1-K_k)\hat{X}_{k-1}$, un promedio de ejecución de los conjuntos de $K_k=\frac 1k$. Si su modelo subyacente es que el parámetro de interés no cambia con el tiempo, es lo que usted consigue. Otras formas son necesarias si $X$ cambios con el tiempo.

1voto

Pavan Nadig Puntos 31

Como se ha mencionado por el anterior cartel, puede utilizar el siguiente filtro de Kalman para implementar un promedio de ejecución:

$\hat{X}_k=K_kZ_k+(1-K_k)\hat{X}_{k-1}$,

donde $k$ va desde 1 a $N-1$. La discrepancia se observa deriva del hecho de que usted no utilice la medición de $Z_0$ en el cálculo. El filtro de Kalman le da el mismo valor para la media de si calcula el promedio de $Z$$k=1..N-1$, es decir, saliendo de la primera medición. Alternativamente, usted puede hacer uno más de iteración por la que se sumó la $k$ por uno, pero el uso de $Z_0$ ($Z_{N}$ no existe).

Espero que esto ayude.

Lucas

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X