Retirar datos atípicos (outliers) de una distribución de datos con Matlab



Los datos atípicos son datos que se alejan mucho de promedio de una distribución. Por lo general, se interpretan como errores experimentales aleatorios, por ello se suelen remover. En esta ocasión te muestro un script que usa cuartiles estadísticos para remover tales datos.

Preguntas para pensar
1)  En que caso un dato atípico brinda información experimental relevante y no debe removerse de la serie.

Ejercicios
1) Sugiere una modificación al guion presentado para usar la desviación-estándar como base para eliminar los datos atípicos.

GUIÓN MATLAB

%% Primer guión para remover datos atípicos
clc; clear; close all
%% Información de entrada
Y = [10 20 -150 40 50 60 70 200 90 100];
X = [2 4 6 8 10 12 14 16 18 20];
%% Cálculos
IQR = iqr(Y); %intervalo  intercuartil,
    % la diferencia entre el tercer  y el primer cuartil
    % de una distribución: 75%-25% de Y
    % σ= IQR * 0.7413

lowr=prctile(Y,25)-1.5*IQR; %Percentiles. Q1 - 1.5IQR.
highr=prctile(Y,75)+1.5*IQR; % Q3 + 1.5IQR

new_Y = Y(Y>lowr &   Y
new_X = X(Y>lowr &   Y

%%ver; es creer

hold on
plot(X, Y, 'bo','MarkerSize',20)
plot(new_X, new_Y, 'kx','MarkerSize',20)
hold off
%fin del guión

Juego de volados y casinos ricos



Guión:

%% ¿En cuanto tiempo un casino te deja sin dinero?
% este guion simula un juego de tirar una moneda entre un casino y un
% apostador.

%% Guión escrito por Vicente Torres Zúñiga; 18 de abril 2003.

clc; clear; close all % Limpia la memoria

casino = 100000; % Dinero con el que empieza el casino
apostador = 10; % Dinero con el que empieza el apostador

casino_zero = casino;
apostador_zero = apostador;

num_evento = 0; % Número de veces que han apostado, que se inicia en cero.

dinero_apostador(casino) = 0; % Tentativamente pongo este vector para
% hacer más rapida la asignición de memoria. Pero al final el vector puede
% ser más grande o pequeño que esta asignación

% Todas las apuestas son iguales, de una unidad. Es decir, en un juego
% se pierde o gana una unidad.

while (apostador > 0 && casino > 0)
num_evento = num_evento +1;
dinero_apostador(num_evento) = apostador;
moneda = rand(1); % rand brinda números pseudoaleatorios entre 0 y 1
if moneda >=0.5 % gana el casino
casino = casino +1;
apostador = apostador -1;

else % gana apostador
casino = casino - 1;
apostador = apostador +1;
end
end
porciento_perdida_casino = 100*max(dinero_apostador)/casino_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
porciento_ganancia_apostador = 100*(max(dinero_apostador)- apostador_zero)/apostador_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
num_juegos = num_evento; %cuantos juegos realizamos

% Vizualización
axes('fontsize',14,'fontweight','b')
plot(dinero_apostador,'b', 'LineWidth',6)

xlabel('Número de juego, N', 'fontsize',20,'fontweight','b')
ylabel('Dinero del apostador, D', 'fontsize',20,'fontweight','b')
title(['Al principio, el dinero del casino es ', num2str(casino_zero./apostador_zero), ' veces más grande que el del apostador'], 'fontsize',20,'fontweight','b')
set(gca, 'Fontsize',18, 'fontweight','b')
axis([0, num_juegos, 0, max(dinero_apostador)]);

salida = [porciento_ganancia_apostador, porciento_perdida_casino, num_juegos];

% fin del guión

¿Cuanto ruido puede resolver el proceso de correlación?

Comportamiento del proceso de correlación ante un incremento del ruido aplicado a una imagen 
Resumen
Basado en una entrada anterior, me dio mucha curiosidad saber cómo se comportaría el proceso de correlación ante un incremento controlado de ruido en las imágenes. ¿Siempre tendrá un buen rendimiento?

Así que seleccione una imagen – la original para este estudio – y le añadí ruido por medio de un Corel-Photo-Paint, para crear las imágenes “ruido”. Así, cree diez imágenes que presentaban ruido “gaussiano aleatorio“ en un intervalo de 0 a 100%, con incrementos de 10% para cada una.

Después, le hice unas ligeras modificaciones al código original de identificación de imágenes por correlación, de modo que me mostrara la tendencia del comportamiento del promedio-de-los máximos-de-la-correlación de las imágenes en cuestión (deben ver el código para entender este proceso).

El resultado es la imagen que ilustra esta entrada. Cuando la imagen no presenta ruido, el proceso de correlación de la imagen consigo misma es igual a 1 (el valor ideal). En contraste, cuando la el ruido es máximo la correlación es aprox. 0.6. Más aún la tendencia de de este estudio es una línea recta; en otras palabras, el proceso de correlación es lineal en función del ruido añadido. Lo cual es una buena noticia para quienes usamos esta función para diversos estudios comparativos.

Sin embargo, falta hacer este estudio con ruido programado desde Matlab u otro software con mayor control de las variables del ruido añadido. De modo que sea claro cuál es el umbral cuantitativo que muestre cuando este proceso sea inadecuado.

Preguntas para pensar
1) ¿Cómo se comportara este proceso ante ruido armónico?
2) Por si sólo este proceso no identifica el tipo de ruido. ¿Solo sirve para discriminar?, ¿Cómo se puede usar como filtro para mejorar la imagen?

Ejercicios
1) Use Matlab para añadir ruido a la imagen de modo sistemático. Analice los archivos generados. ¿Cómo se comporta el proceso de correlación ante el ruido blanco, el rosa, y otros?

Solución al ejercicio: Identificando huellas digitales simuladas con Matlab (video y script)



Resultado gráfico del análisis de las imágenes. El archivo núm. 14 corresponde al  análisis de la misma imagen. De toda la base datos, el archivo núm. 3 es el que se parece más al archivo núm. 14



Resumen
Hace unos días propuse un ejercicio estilo el programa de televisión CSI. Dibuje unos cuantos garabatos como si fueran huellas digitales; a una de ellos lo llamé "asesino" al resto "sospechoso_num" --a todas las imágenes les añadí un poco de ruido--. Pues bien. revisando la pequeña base de datos uno se puede dar cuenta que el archivo asesino coincide con la imagen del sospechoso número 3. El ejercicio trata de emplear código Matlab para hacer esta identificación.

Pueden existir muchas soluciones, aquí les muestre el uso de la función correlación estadística  (CORR, en Matlab) para hacer esta identificación automática. La correlación permite comparar señales, se usa mucho para estimar ajustes de curvas a datos experimentales, entre otras aplicaciones. En el caso ideal, cuando la imagen se compara consigo misma, la correlación es uno; cuando las imágenes son totalmente dispares, la correlación vale cero. En este caso, los análisis que más se aproximen a 1 indican mayor probabilidad de tener identificación de nuestro "asesino". 

Ahora bien, nos apoyamos en la obtención del máximo (MAX en Matlab) y luego del promedio (MEAN en Matlab) para tener el valor más representativo de la mayor variación que se puede presentar en el análisis. 

La figura que ilustra este post muestra el  resultado del script --que se presenta al final de la entrada-- . Podemos ver que la comparación de la imagen consigo misma da 1, y que el archivo 3 es el que más se acerca al valor ideal. Mientras que los demás valores están bastante alejados del valor del archivo núm. 3. Por lo cual la identificación es exitosa.

Preguntas para pensar
1) Menciona otras aplicaciones de la función de correlación.
2) ¿Mediante que otra función se puede hacer el análisis de identificación?

Ejercicios
1) A la base de datos de imagenes asocie una base datos con nombres ficticios. (Por ejemplo: alfa, beta, gamma, etc.)   Modifique el guión para que la pantalla le de el nombre del sospechoso más probable.
2) Dibuje sus propios garabatos y haga experimentos. Por ejemplo, a una imagen añada diferentes cantidades y clases de ruido.  Identifique cuales son los limites de este análisis.
3) Sí las imágenes se giran, la identificación es valida. Haga experimentos.
4) La función correlación es la que más tiempo consume en el guion. ¿Cómo puede aumentar el tiempo de calculo para hacer más rápido el proceso?

% INICIO DE GUION EN MATLAB
%Cierra todas las ventanas emergentes, limpia la memoria y la pantalla
close all; clear; clc;
Ases = imread('asesino','jpeg'); %Lee la imágen y la asocia a una matriz
G = fft2(Ases); %Calcula la transformada de fourier en 2D de la imagen
m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

% Con este for cargamos las imagenes, las procesamos y obtenemos un valor
% significativo
for n =1:12
nom_arch=['sospechoso', num2str(n)]; %esta cadena de caracteres cambia como lo hace n
Sosp =imread(nom_arch, 'jpeg'); %se carga la imagen a trabajar
F = fft2(Sosp); % se obtiene la trasformada de Fourier
m(n) = mean(max(corr(F,G))); % Se comparara la imagen con un estándar
%m(i).- Se guarda el valor del i-ésimo sospechoso en la entrada m(i)
end

% Se define el contador x, para graficar
x = 1:13;
% Grafica de x, m. Utilizo puntos rojo y lineas verticales azules
h = stem(x,m,'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')

%Formato de la gráfica
xlabel('Etiqueta para el de sospechoso (número)');
ylabel('Correlación entre imagenes');
axis([0 14 0 1.1]);

% clear
% clc
%fin del script

Cómo hacer interfaces gráficas para usuario (GUI) con guide de Matlab

Imagen vía: smallbiz
Del el documento de CONATEC 2002 hemos visto varios ejemplos del uso de GUIDE para hacer GUI en Matlab, espero que puedan hacer TODOS los ejemplos.

Código Matlab para hacer un contador de franjas de interferencia




Resumen
Esta es una aplicación sencilla de Matlab para analizar imágenes. Se trata de cargar la imagen segmentada de un interferograma - sus franjas de interferencia deben ser verticales -. La imagen se transforma en matriz, se colapsa en vector, y se transforma en datos de ceros y unos. Al barrer la matriz se puede contar el numero de transiciones ,el cual es proporcional al número de franjas.


Muchos de los comandos que se emplean en este ejemplo los hemos explicado en anteriores entradas, y se mencionan sus funciones en el video.

Descarga el archivo: contador_de_franjas.rar que contiene el código, las imagenes originales, y las imágenes segmentedas para que puedas hacer los ejercicios propuestos.

Ejercicios
1) Optimice la velocidad de ejecución de este código. Comience eliminando las lineas de código que no se usan más adelante.
2) ¿Como se pueden eliminar los artefactos de ruido?, de modo que se mejore el desempeño del conteo de franjas
3) Transforme este guión en una función
4) Integre a video este código (esta tarea es avanzada)

Presentación de funciones de transferencia en Matlab

Estas son notas que hemos visto en clase. La idea es que practiquen sus habilidades para hacer código en Matlab.

Si ven un error en la presentación, dejen un comentario ;)

Ejercicio: Jugando al detective CSI con Matlab

He creado una pequeña base de datos de varias imágenes de garabatos. A una de ellas le he llamado asesino, el resto las he llamado sospechoso. El ejercicio consiste en escribir código Matlab para identificar de las imagenes de sospechosos al  patrón que más se parezca a la imagen que llame asesino.

Las imágenes contienen un poco de ruido gaussiano, por lo cual hay que filtrar ese ruido. Dependiendo de su desempeño, se puede hacer más interesante este ejercicio.

Por su puesto estos temas, en la vida real, son más complicados. Las bases de datos son más grandes, se deben de identificar varios puntos de coincidencia, el ruido es mucho, mucho mayor. Con todo, es un buen ejercicio. 

En caso de tener cualquier clase de duda, escriban un comentario en el blog.

Tres ejemplos de matemáticas discretas

Pueden consultar los post relacionados con los temas que vimos el día de hoy:



Por su puesto, revisen a detalle el excelente ejemplo de filtraje de electrocardiogramas. Finalmente, consulten el código para hacer la primera derivada. Uds. pueden hacer el código para hacer la primera integral de una función discreta.

¿Me falto mencionar algo? Dejen un comentario si necesitan más información u omití algo importante. 





Related Posts Plugin for WordPress, Blogger...