Programación de MATLAB del filtro de partículas: ¿qué está mal?

2

Estoy trabajando en un experimento de filtro de partículas para la fusión multisensor y lo programé en MATLAB. Sin embargo, obtengo precisiones muy bajas para mis valores finales. Además, leí mucha literatura donde se habla de pdf de estado y observaciones, etc. pero mi conocimiento práctico es todavía muy inestable, ya que no he recibido capacitación formal en filtrado / estimaciones bayesianas, etc.

He ideado mi algoritmo de esta manera:

  1. Inicializar partículas = Lo estoy haciendo como una distribución gaussiana: 10 partículas

  2. Mueve las 10 partículas hacia adelante usando la ecuación de transición de estado: X_t + 1 = A * X_t + 0.1 * rand () (solo se inyecta ruido gaussiano hasta ahora)

  3. Usando la observación, calcula los pesos para 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 azimut (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

  4. Luego normalizo estos pesos para obtener norm_weight = weight / norm (peso) de modo que su suma sea igual a uno.

  5. Luego sigo adelante para todas las observaciones. No he incluido el remuestreo todavía porque cuando ejecuto este experimento, no experimento ninguna degeneración, lo que también es muy desconcertante.

¿A dónde me voy mal? Me di cuenta de que no he 'computado' muchas ecuaciones bayesianas dadas en la literatura, es decir, p (x / z_t) = p (z_t / x) * p (x) / p (z) etc. y no lo hago ' No sé dónde encaja aquí tampoco. ¿Puede alguien ayudarme por favor?

Mi código de Matlab tiene este 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
    
pregunta Imelza

1 respuesta

1

Tengo algunos comentarios sobre cosas que arreglar.

Primero, tu for j = 1:length(observationx) no parece tener un final. Supongo que deberías tener esto justo antes de la línea norm_weight = weight/norm(weight); .

El segundo estado de apriori, rms y peso cambia de tamaño en cada iteración. Esto puede hacer que matlab se ejecute muy lento. Para mejorar esto necesitas preasignar la variable. Esto se puede hacer así: apriori_state = zeros(size(resultx_1));

En cuanto a la funcionalidad real, no veo nada que parezca incorrecto. El sitio de estadísticas y matemáticas vinculado en un comentario podría encontrar errores de funcionalidad más rápido que yo.

    
respondido por el Kellenjb

Lea otras preguntas en las etiquetas