Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

Suavizado de datos y detección de valores atípicos

El suavizado de datos hace referencia a las técnicas para eliminar ruido o comportamientos no deseados en los datos, mientras que la detección de valores atípicos identifica puntos de datos que son significativamente diferentes del resto de los datos.

Métodos de ventana móvil

Los métodos de ventana móvil son formas de procesar datos en lotes más pequeños de una sola vez, normalmente para representar estadísticamente un conjunto de puntos agrupados en los datos. La media móvil es una técnica de suavizado de datos común que desliza una ventana a lo largo de los datos, calculando la media de los puntos dentro de cada ventana. Esto puede ayudar a eliminar variaciones insignificantes de un punto de datos al siguiente.

Por ejemplo, considere las mediciones de velocidad del viento tomadas cada minuto durante aproximadamente 3 horas. Utilice la función movmean con una ventana de 5 minutos para suavizar las ráfagas de viento de alta velocidad.

load windData.mat
mins = 1:length(speed);
window = 5;
meanspeed = movmean(speed,window);
plot(mins,speed,mins,meanspeed)
axis tight
legend('Measured Wind Speed','Average Wind Speed over 5 min Window','location','best')
xlabel('Time')
ylabel('Speed')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Measured Wind Speed, Average Wind Speed over 5 min Window.

Del mismo modo, puede calcular la mediana de la velocidad del viento a través de una ventana deslizante utilizando la función movmedian.

medianspeed = movmedian(speed,window);
plot(mins,speed,mins,medianspeed)
axis tight
legend('Measured Wind Speed','Median Wind Speed over 5 min Window','location','best')
xlabel('Time')
ylabel('Speed')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Measured Wind Speed, Median Wind Speed over 5 min Window.

No todos los datos son adecuados para suavizar con un método de ventana móvil. Por ejemplo, cree una señal sinusoidal con ruido aleatorio inyectado.

t = 1:0.2:15;
A = sin(2*pi*t) + cos(2*pi*0.5*t);
Anoise = A + 0.5*rand(1,length(t));
plot(t,A,t,Anoise)
axis tight
legend('Original Data','Noisy Data','location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Noisy Data.

Utilice una media móvil con una ventana de 3 para suavizar el ruido de los datos.

window = 3;
Amean = movmean(Anoise,window);
plot(t,A,t,Amean)
axis tight
legend('Original Data','Moving Mean - Window Size 3')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Moving Mean - Window Size 3.

La media móvil logra la forma general de los datos, pero no captura los valles (mínimos locales) con demasiada precisión. Dado que los puntos del valle están rodeados por dos vecinos más grandes en cada ventana, la media no es una muy buena aproximación a esos puntos. Si hace que la ventana sea más grande, la media elimina los picos más cortos por completo. Para este tipo de datos, puede considerar técnicas de suavizado alternativas.

Amean = movmean(Anoise,5);
plot(t,A,t,Amean)
axis tight
legend('Original Data','Moving Mean - Window Size 5','location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Moving Mean - Window Size 5.

Métodos comunes de suavizado

La función smoothdata proporciona varias opciones de suavizado, como el método Savitzky-Golay, que es una técnica de suavizado popular utilizada en el procesamiento de señales. De forma predeterminada, smoothdata selecciona la mejor estimación del tamaño de la ventana para el método en función de los datos.

Utilice el método Savitzky-Golay para suavizar la señal ruidosa Anoise y generar el tamaño de la ventana que utiliza. Este método proporciona una mejor aproximación del valle en comparación con movmean.

[Asgolay,window] = smoothdata(Anoise,'sgolay');
plot(t,A,t,Asgolay)
axis tight
legend('Original Data','Savitzky-Golay','location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Savitzky-Golay.

window
window = 3

El método Lowess robusto es otro método de suavizado que es particularmente útil cuando hay valores atípicos presentes en los datos además del ruido. Inyecte un valor atípico en los datos ruidosos y utilice Lowess robusto para suavizar los datos, lo que elimina el atípico.

Anoise(36) = 20;
Arlowess = smoothdata(Anoise,'rlowess',5);
plot(t,Anoise,t,Arlowess)
axis tight
legend('Noisy Data','Robust Lowess')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Noisy Data, Robust Lowess.

Detectar valores atípicos

Los valores atípicos de los datos pueden sesgar significativamente los resultados del procesamiento de datos y otras cantidades calculadas. Por ejemplo, si intenta suavizar los datos que contienen valores atípicos con una mediana móvil, puede obtener picos o valles engañosos.

Amedian = smoothdata(Anoise,'movmedian');
plot(t,Anoise,t,Amedian)
axis tight
legend('Noisy Data','Moving Median')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Noisy Data, Moving Median.

Cuando se detecta un valor atípico, la función isoutlier devuelve un 1 lógico. Verifique el índice y el valor del valor atípico en Anoise.

TF = isoutlier(Anoise);
ind = find(TF)
ind = 36
Aoutlier = Anoise(ind)
Aoutlier = 20

Puede usar la función filloutliers para reemplazar valores atípicos en sus datos especificando el método de relleno. Por ejemplo, rellene el valor atípico en Anoise con el valor que está inmediatamente a su derecha.

Afill = filloutliers(Anoise,'next');
plot(t,Anoise,t,Afill)
axis tight
legend('Noisy Data with Outlier','Noisy Data with Filled Outlier')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Noisy Data with Outlier, Noisy Data with Filled Outlier.

Datos no uniformes

No todos los datos consisten en puntos igualmente espaciados, lo que puede afectar a los métodos para el procesamiento de datos. Cree un vector datetime que contenga tiempos de muestra irregulares para los datos de Airreg. El vector time representa muestras tomadas cada minuto durante los primeros 30 minutos, luego cada hora durante dos días.

t0 = datetime(2014,1,1,1,1,1);
timeminutes = sort(t0 + minutes(1:30));
timehours = t0 + hours(1:48);
time = [timeminutes timehours];
Airreg = rand(1,length(time));
plot(time,Airreg)
axis tight

Figure contains an axes. The axes contains an object of type line.

De forma predeterminada, smoothdata suaviza con respecto a los números enteros igualmente espaciados, en este caso, 1,2,...,78. Dado que las marcas de tiempo de números enteros no se coordinan con el muestreo de los puntos en Airreg, la primera media hora de datos sigue siendo ruidosa después del suavizado.

Adefault = smoothdata(Airreg,'movmean',3);
plot(time,Airreg,time,Adefault)
axis tight
legend('Original Data','Smoothed Data with Default Sample Points')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Smoothed Data with Default Sample Points.

Muchas funciones de procesamiento de datos de MATLAB®, incluidas smoothdata, movmean y filloutliers, le permiten proporcionar puntos de muestra, asegurando que los datos se procesan en relación con sus frecuencias y unidades de muestreo. Para eliminar la variación de alta frecuencia en la primera media hora de datos en Airreg, utilice la opción 'SamplePoints' con las marcas de tiempo en time.

Asamplepoints = smoothdata(Airreg,'movmean',hours(3),'SamplePoints',time);
plot(time,Airreg,time,Asamplepoints)
axis tight
legend('Original Data','Smoothed Data with Sample Points')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Smoothed Data with Sample Points.

Consulte también

| | | |

Temas relacionados