lunes, 12 de mayo de 2014

ML II: Asunción de Markov y Redes Bayesianas.

Siguiendo con el ejemplo del artículo anterior que pasa si agregamos una nueva medida del sensor de luz, representada por la variable aleatoria Luz2. Queremos ahora conocer p(Puerta=abierta|Luz1, Luz2).
Usando Bayes tenemos:
Ahora sabemos que Luz1 no afecta a la medida de Luz2, por tanto son variables independientes y condicionalmente independientes dado Puerta.
Esto es llamado la Asunción de Markov, pues no depende del estado anterior.

Realizando el cálculo al reemplazar valores resulta:

P: Puerta, L1: Luz1, L2: Luz2
Con datos:

Como conclusión se nota que el conocer Luz2 merma la probabilidad de que la puerta este abierta en comparación a cuando solo se conocía Luz1.

Asunción de Markov. Más formalmente se define, asumiendo que se tienen medidas Zn condicionalmente independientes a otra variable X.



Ahora llevemos el ejemplo a  Sensar y Actuar, es decir el robot conoce si la puerta esta abierta o cerrada y actúa en consecuencia cerrándola o abriéndola. (Un sencillo Agente Inteligente)

Para esto modelemos la acción como una variable aleatoria U=u, y queremos conocer la probabilidad condicional de p(Puerta|U). 
 El gráfico de arriba muestra las probabilidades de transición de pasar de la puerta abierta a cerrada, un 90%, viceversa o que se mantenga en el mismo estado.

Donde P: Puerta, PA: Puerta en su estado anterior, U: acción. Y con los datos del último ejemplo se tiene
Al final interesa la p(Puerta=cerrada|u) por que con el sensor tratábamos de conocer si la puerta está abierta  y el objetivo es cerrar la puerta.

Por eso hasta ahora logramos conseguir el estado del sistema mediante la actualización por el sensor y por la acción realizada. Ahora tratemos de combinar ambas.
Para eso definiremos la creencia (Belief). 
Podemos describir el proceso general mediante una Red Bayesiana Dinámica:

Esto incorpora las siguientes Asunciones de Markov:
Con estas ultimas expresiones usando Bayes se llega a:
Dado que la creencia es recursiva es posible realizar su calculo mediante un algoritmo:

 Algoritmo Filtro de Bayes (Bel(x),d)


 El filtro de Bayes es principalmente usado en: 
  • Filtro de Kalman.
  • Filtro de Partículas.
  • Modelos Ocultos de Markov
  • Redes  Bayesianas Dinámicas.
  • Procesos de Decisión de Markov Parcialmente Observables.

Que a su vez son usados en clasificación de patrones y seguimiento de objetos en imágenes.

En resumen:
• El razonamiento probabilístico es necesaria para hacer frente a la información incierta, por ejemplo, mediciones de sensores 
• Usando la regla de Bayes, podemos hacer el razonamiento de diagnóstico basados en el conocimiento causal 
• El resultado de las acciones de un robot se puede describir mediante un diagrama de transición de estado. 
• La estimación de estado probabilístico se puede hacer de forma recursiva mediante el filtro de Bayes usando un sensor y una actualización de movimiento 
• Una representación gráfica para el problema de estimación de estado es la Red Bayesiana Dinámica.

Scilab
Ahora como ejercicio en Scilab crearemos una función Normal de probabilidad e implementaremos una integral. Para la integral usaremos simplemente su definición que es la de una suma de la función tomada en pequeños intervalos.

Primero abrimos Scilab y dentro de este a SciNotes.
En este editor escribiremos el siguiente código:

//Función de una densidad de probabilidad normal
//x: es un arreglo unidimensional del dominio de la función. Arreglo(float) 
//u: es el valor esperado o media. float
//s2: es la varianza de la densidad. float  
function fnormal = normal(x, u, s2 )
    fnormal=1/(sqrt(2*%pi*s2))*exp(-(x-u).^2/(2*s2));
endfunction    

Y guardamos como norma.sci. Ejecutamos con el símbolo de Play

Luego en un nuevo archivo copiamos el siguiente código:

//Función para calcular una integral definida
//x: es un arreglo(vector) unidimensional del dominio de la función
//fx: es la función. Arreglo(float)
//a: limite inferior de la integral. float
//b: limite superior de la integral. float
function F=integral(x,fx,a,b)
    delta=x(2)-x(1); //Separación en el eje x
    F=0; //Valor inicial
    j=1; //Variables auxiliares
    inf=1;
    sup=length(x);
//Primero comprobamos que los limites dados estén dentro del dominio
    if x(1)>a | x(1)>b then
        messagebox("Limite inferior erroneo, funcion no definida", "Error", "error");
    end
    if b>x(length(x))| a>x(length(x)) then
        messagebox("Limite superior erroneo, funcion no definida", "Error", "error");
    end

//Segundo encontramos los limites en nuestro arreglo x.
//sup indicara el indice del limite superior e inf el indice del limite inferior
    if b>a then
        while(x(j)<b & j<length(x))
            if x(j)<=a then
                inf=j;  
            end
        j=j+1;
        end
    sup=j;
//Calculamos la integral sumando los valore, como delta es constante se multiplica al final    
for i=inf:sup
        F=F+fx(i)
    end
    F=F*delta;

elseif b<a then
    while(x(j)<a & j<length(x))
        if x(j)<=b then
            inf=j;  
        end
        j=j+1;
    end
    sup=j;
    for i=inf+1:sup
       F=F-fx(i); 
    end
    F=F*delta;
    
    end

endfunction

//Función para obtener la función resultante de integra fx, 
//es la integral indefinida o pues no tiene limites definidos
//x: es un arreglo(vector) unidimensional del dominio de la función
//fx: es la función. Arreglo(float)
function IndF=fintegral(x,fx)
   delta=x(2)-x(1); 
IndF=zeros(length(x));
IndF(1)=fx(1)*delta;
//IndF ya no es un valor sino otro vector que tiene como datos los valores la integral
 for i=2:length(x)
        IndF(i)=IndF(i-1)+fx(i)*delta;
    end
return IndF
endfunction

Guarda como integral.sci y ejecuta.

Finalmente copia esto en la interfaz principal y presiona enter o crea un nuevo archivo y ejecuta

clc
//Dominio de las funciones
x=-30:0.01:30;
//Ejemplos de Densidades
pdf1=normal(x,0,1);
pdf2=normal(x,0,49);
pdf3=normal(x,4,1);
pdf4=normal(x,-10,9);
//Dibujar
plot(x,pdf1,'r-.',x,pdf2,'b--',x,pdf3,'g-',x,pdf4,'m:');
//r=rojo, b=azul, g=verde, m=magenta
//Probabilidad de que X de pdf1 este entre 0 y 1
Prob=integral(x,pdf1,0,1);
PDF=fintegral(x,normal(x,3,40));
figure();
plot(x,PDF);
disp(Prob, "La probabilidad de X es de ");

Si te salen estas figuras lo has hecho todo bien:



Con relación a la figura 2 se puede observar que PDF es una función creciente que empieza en su parte izquierda con 0 y en la parte más a la derecha tiene el valor de 1. A esto se le llama la función de distribución de probabilidad.

Como ultimo punto ingresa estas lineas  una por una en la interfaz principal, sin punto y coma para que se muestre el resultado
Prob1=integral(x,pdf1,-1,1)
Prob2=integral(x,pdf1,-2,2)
Prob3=integral(x,pdf1,-3,3)
Prob4=integral(x,pdf1,-4,4)
Prob5=integral(x,pdf1,-5,5)
Prob6=integral(x,pdf1,-6,6)
Estas son las probabilidades de la gaussiana normalizada, con media cero y varianza uno, para 1,2,3,4,5 y 6 varianzas o . Esto nos sirve para verificar nuestra integral ya que segun wikipedia los valores exactos de la llamada función error son:
Como punto adicional puedes ver cual es el error de nuestro método para integrar, pues existen otros métodos numéricos diseñados para realizar justamente este tipo de integrales que son casi imposibles de realizar manualmente.


No hay comentarios:

Publicar un comentario