Усреднение данных и определение выбросов

Усреднение данных относится к методам для устранения нежелательного шума или поведений в данных, в то время как определение выбросов идентифицирует точки данных, которые существенно отличаются от остальной части данных.

Перемещение методов окна

Движущиеся методы окна являются способами обработать данные в меньших пакетах за один раз, обычно для того, чтобы статистически представлять окружение точек в данных. Скользящее среднее значение является общими данными, сглаживающими метод, который двигает окно вдоль данных, вычисляя среднее значение точек в каждом окне. Это может помочь устранить незначительные изменения от одной точки данных до следующего.

Например, считайте измерения скорости ветра бравшимися каждую минуту в течение приблизительно 3 часов. Используйте movmean функция с размером окна 5 минут, чтобы сгладить высокоскоростные порывы ветра.

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')

Точно так же можно вычислить среднюю скорость ветра по раздвижному окну с помощью 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')

Не все данные подходят для сглаживания с движущимся методом окна. Например, создайте синусоидальный сигнал с введенным случайным шумом.

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')

Используйте скользящее среднее значение с размером окна 3, чтобы сглаживать зашумленные данные.

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

Скользящее среднее значение достигает общей формы данных, но не получает овраги (локальные минимумы) очень точно. Поскольку точки оврага окружаются двумя более крупными соседями в каждом окне, среднее значение не является очень хорошим приближением к тем точкам. Если вы делаете размер окна больше, среднее значение устраняет более короткий peaks в целом. Для этого типа данных вы можете рассмотреть альтернативные методы сглаживания.

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

Общие методы сглаживания

smoothdata функция предоставляет несколько возможностей сглаживания, таких как метод Savitzky-Golay, который является популярным методом сглаживания, используемым в обработке сигналов. По умолчанию, smoothdata выбирает размер окна лучшего предположения для метода в зависимости от данных.

Используйте метод Savitzky-Golay, чтобы сглаживать сигнал с шумом Anoise, и выводит размер окна, который это использует. Этот метод обеспечивает лучшее приближение оврага по сравнению с movmean.

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

window
window = 3

Устойчивый метод Lowess является другим методом сглаживания, который особенно полезен, когда выбросы присутствуют в данных в дополнение к шуму. Введите выброс в зашумленные данные и используйте устойчивый Lowess, чтобы сглаживать данные, которые устраняют выброс.

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

Обнаружение выбросов

Выбросы в данных могут значительно скосить результаты обработки данных и другие вычисленные количества. Например, при попытке сглаживать данные, содержащие выбросы с движущейся медианой, можно получить вводящий в заблуждение peaks или овраги.

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

isoutlier функция возвращает логическую единицу, когда выброс обнаруживается. Проверьте индекс и значение выброса в Anoise.

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

Можно использовать filloutliers функционируйте, чтобы заменить выбросы в ваших данных путем определения метода заполнения. Например, заполните выброс в Anoise со значением его соседа сразу направо.

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

Неоднородные данные

Не все данные состоят из равномерно распределенных точек, которые могут влиять на методы для обработки данных. Создайте datetime вектор, который содержит неправильное время выборки для данных в Airreg. time вектор представляет выборки, бравшиеся каждую минуту в течение первых 30 минут, затем каждый час более чем двух дней.

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

По умолчанию, smoothdata сглаживает относительно равномерно распределенных целых чисел, в этом случае, 1,2,...,78. Поскольку целочисленные метки времени не координируют с выборкой точек в Airreg, час первой половины данных все еще кажется шумным после сглаживания.

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

Много функций обработки данных в MATLAB®, включая smoothdatamovmean, и filloutliers, позвольте вам обеспечивать точки выборки, гарантируя, что данные обрабатываются относительно его модулей выборки и частот. Удалить высокочастотное изменение в час первой половины данных в Airreg, используйте 'SamplePoints' опция с метками времени в time.

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

Смотрите также

| | | |

Похожие темы