2011-05-27 27 views
6

Tengo una matriz cuadrada que representa los recuentos de frecuencia de co-ocurrencias en un conjunto de datos. En otras palabras, las filas representan todas las observaciones posibles de la característica 1, y las columnas son las posibles observaciones de la característica 2. El número en la celda (x, y) es el número de veces que se observó que la característica 1 era x al mismo tiempo la característica 2 era y.Información mutua de MATLAB Matrix

Quiero calcular la información mutua contenida en esta matriz. MATLAB tiene una función incorporada information, pero toma 2 argumentos, uno para xy uno para y. ¿Cómo manipularía esta matriz para obtener los argumentos que espera?

Como alternativa, escribí mi propia función de información mutua que toma una matriz, pero no estoy seguro de su precisión. ¿Se ve bien?

function [mutualinfo] = mutualInformation(counts) 

    total = sum(counts(:)); 
    pX = sum(counts, 1) ./ total; 
    pY = sum(counts) ./ total; 
    pXY = counts ./ total; 

    [h, w] = size(counts); 

    mutualinfo = 0; 

    for row = 1:h 
    for col = 1:w 
     mutualinfo = mutualinfo + pXY(row, col) * log(pXY(row, col)/(pX(row)*pY(col))); 
    end; 
    end; 

end 

Respuesta

6

No conozco ninguna función de información mutua incorporada en MATLAB. Tal vez tienes una de las presentaciones del MathWorks File Exchange o de alguna other third-party developer code?

Creo que puede haber algún problema con la forma de calcular pX y pY. Además, puede vectorizar sus operaciones en lugar de usar bucles for. Aquí hay otra versión de su función para probar:

function mutualInfo = mutualInformation(counts) 

    pXY = counts./sum(counts(:)); 
    pX = sum(pXY,2); 
    pY = sum(pXY,1); 

    mutualInfo = pXY.*log(pXY./(pX*pY)); 
    mutualInfo = sum(mutualInfo(:)); 

end 
+0

Esta función devuelve los mismos valores que mi original, por lo que creo que son equivalentes. Aún así, el tuyo es más elegante. – Colin