He publicado este pregunta en Electronics.Stackexchange y alguien me dijo que sería mejor publicarla aquí.
Es una implementación del Filtro de Partículas usando MATLAB pero los resultados nunca siguen las observaciones. He cambiado la función de ponderación para ser gaussiano, pero todavía no sirve.
NOTA: No he tenido en cuenta que el ruido del proceso/medición está relacionado con el tiempo. ¿Cambiará esto significativamente la precisión de mi programa? Si es así, ¿cómo puedo corregirlo?
MI ANTIGUA PREGUNTA
Estoy trabajando en un experimento de filtro de partículas para la fusión de multisensores y acabo de programarlo en MATLAB. Sin embargo, obtengo precisiones muy bajas para mis valores finales. Además, he leído mucha literatura donde se habla de pdf de estado y observaciones, etc., pero mi conocimiento práctico es todavía extremadamente inestable, ya que he tenido ninguna formación formal en el filtrado / estimaciones bayesianas, etc.
He ideado mi algoritmo así:
-
Inicializar las partículas = Lo hago como una distribución gaussiana - 10 partículas
-
Mueve las 10 partículas hacia adelante utilizando la ecuación de transición de estado:
\begin{equation} X_{t+1} = A \times X_t + 0.1 \times rand() \end{equation} De momento sólo estoy inyectando ruido gaussiano.
-
A partir de la observación, calcula los pesos de las partículas. Hago esto como una raíz cuadrada de la diferencia entre el estado predicho y la observación. Por ejemplo, si mi acimut(a) = 40, pitch(p) = 3, roll(r)=4 en mi estado y en mi observación es a = 39, p = 3, r = 3, entonces hago rms = sqrt((40-39)^2 + (3-3)^2 + (4-3)^2). Entonces mi peso se asigna como 1/rms para que sea inversamente proporcional a la "distancia" entre la predicción y la observación
-
A continuación, normalizo estos pesos para obtener norm_weight = weight/norm(weight) para que su suma sea igual a uno.
-
Luego sigo adelante para todas las observaciones. Todavía no he incluido el remuestreo porque cuando ejecuto este experimento, no experimento ninguna degeneración, lo que también es muy desconcertante.
¿En qué me estoy equivocando? Me he dado cuenta de que no he "calculado" muchas de las ecuaciones bayesianas dadas en la literatura, es decir
\begin{equation} p(x|z_t) = p(z_t|x)\times p(x)/p(z) \end{equation} y tampoco sé dónde encaja aquí. ¿Puede alguien ayudarme, por favor?
Mi código de Matlab tiene el siguiente aspecto:
function resultx = particlefilter(resultx_1, observationx, A, noiseP)
for j = 1:length(observationx)
for i = 1:length(resultx_1)
apriori_state{i} = A*resultx_1{i} + noiseP;
rms(i) = sqrt((observationx{j}(1) - apriori_state{i}(1))^2 +
(observationx{j}(2) - apriori_state{i}(2))^2);
weight(i) = 1/rms(i);
end;
norm_weight = weight/norm(weight);
for i = 1:length(apriori_state)
plot(apriori_state{i});
end
disp(rms);
disp(norm_weight);
end