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

хампель (данные)

Это очень прямолинейно и обычно помогает.

Давайте сгенерируем некоторые поддельные данные и поместим в них некоторые выбросы:

rng(10)
mydata = normrnd(0,1,100,1);
mydata([25,50,75]) = 5;

Теперь мы применим hampel с его собственными параметрами по умолчанию и посмотрим, что у нас получится.

mydata_filtered = hampel(mydata);

Вау!

Мы можем использовать patch, чтобы показать нам, какие точки данных были удалены.

Перезапустите с искусственными данными.

rng(10)
mydata = normrnd(0,1,100,1);
mydata([25,50,75]) = 5;

Преимущество hampel в том, что вы можете использовать его, чтобы узнать, какие точки он удалил.

Он не скажет вам точное число, но даст вам вектор с 1, где он удалил точку, и 0 везде в остальном (вы можете использовать find, чтобы получить индексы в массиве, если это ваше дело) . Это очень хорошо работает с patch, о котором я рассказывал вчера.

[mydata_filtered,filtered_logical] = hampel(mydata);
mydata_filtered(end+1) = nan;
filtered_logical(end+1) = nan;
x_values = [1:numel(mydata_filtered)];
patch(x_values, mydata_filtered,... filtered_logical,'marker','o','markerfacecolor','flat')

Окончательный вывод должен выглядеть примерно так:

Но мы можем лучше!

Точная настройка гампеля

Для достижения наилучших результатов можно настроить параметры, заданные функции hampel.

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

Используйте приведенный ниже код, чтобы настроить функцию hampel и посмотреть, что получится!

[mydata_,logical_] = hampel(mydata,20,4)