Мы все имели дело с выбросами в наших данных временных рядов. Вот одна очень простая функция, которую вы можете использовать для их удаления.
хампель (данные)
Это очень прямолинейно и обычно помогает.
Давайте сгенерируем некоторые поддельные данные и поместим в них некоторые выбросы:
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)