Як знайти піки в наборі даних?


47

Якщо у мене є набір даних, який створює такий графік, як наведено нижче, я б алгоритмічно визначити значення x показаних піків (у цьому випадку їх три):

введіть тут опис зображення


13
Я бачу шість локальних максимумів. На яких трьох ви посилаєтесь? :-). (Звичайно, це очевидно - поштовх мого зауваження полягає в тому, щоб спонукати вас визначити "пік" точніше, тому що це ключ до створення хорошого алгоритму.)
whuber

3
Якщо дані є чисто періодичним часовим рядом із додаванням якогось компонента випадкового шуму, ви можете встановити функцію гармонічної регресії, де період та амплітуда є параметрами, які оцінюються за даними. Отримана модель була б періодичною функцією, яка є гладкою (тобто функцією декількох синусів і косинусів), і, отже, вона матиме однозначно визначені часові моменти, коли перша похідна дорівнює нулю, а друга похідна від'ємна. Це були б вершини. Місця, де перша похідна дорівнює нулю, а друга похідна позитивна, - це те, що ми називаємо коритами.
Майкл Черник

2
Я додав тег режиму, ознайомтеся з декількома запитаннями, у них з’являться цікаві відповіді.
Енді Ш

Дякую всім за відповіді та коментарі, це дуже цінується! Знадобиться певний час, щоб зрозуміти та реалізувати запропоновані алгоритми, що стосуються моїх даних, але я обов’язково оновлю пізніше зворотній зв'язок.
неаксіоматичний

Можливо, це тому, що мої дані справді галасливі, але я не мав жодного успіху у відповіді нижче. Хоча я мав успіх у цій відповіді: stackoverflow.com/a/16350373/84873
Даніель

Відповіді:


35

Загальний підхід полягає в згладжуванні даних, а потім пошуку піків шляхом порівняння локального максимального фільтра з гладким . В R:

argmax <- function(x, y, w=1, ...) {
  require(zoo)
  n <- length(y)
  y.smooth <- loess(y ~ x, ...)$fitted
  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)
}

Його повернене значення включає аргументи локальних максимумів ( x) - це відповідає на питання - та індексує у масиви x- та y, де трапляються ці локальні максимуми ( i).

Є два параметри, які слід налаштовувати на обставини: w це половина ширини вікна, що використовується для обчислення локального максимуму. (Його значення повинно бути значно менше половини довжини масиву даних.) Невеликі значення дозволять назбирати крихітні локальні удари, тоді як більші значення перейдуть прямо над ними. Ще один - не явний в цьому коді - spanаргумент loessбільш плавного. (Зазвичай це між нулем і одиницею; він відображає ширину вікна як пропорцію діапазону значень x.) Більші значення згладжують дані більш агресивно, змушуючи локальні удари зникати зовсім.

Щоб побачити цю настройку по суті, давайте створимо невелику тестову функцію для побудови результатів:

test <- function(w, span) {
  peaks <- argmax(x, y, w=w, span=span)

  plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", span, sep=""))
  lines(x, peaks$y.hat,  lwd=2) #$
  y.min <- min(y)
  sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
         col="Red", lty=2))
  points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}

Ось кілька експериментів, застосованих до деяких синтетичних, трохи шумних даних.

x <- 1:1000 / 100 - 5
y <- exp(abs(x)/20) * sin(2 * x + (x/5)^2) + cos(10*x) / 5 + rnorm(length(x), sd=0.05)
par(mfrow=c(3,1))
test(2, 0.05)
test(30, 0.05)
test(2, 0.2)

Сюжети

Або широке вікно (середня ділянка), або більш агресивна гладка (нижня ділянка) усувають локальні максимуми, виявлені у верхній ділянці. Найкраща комбінація тут, ймовірно, широке вікно і лише м'яке згладжування, оскільки, здається, агресивне згладжування зміщує ці вершини (див. Середину та праву точки нижньої ділянки та порівняння їх розташування з очевидними вершинами вихідних даних). У цьому прикладі w=50і span=0.05чудово справляється (не показано).

Зауважте, локальні максимуми в кінцевих точках не виявлені. Їх можна оглянути окремо. (Щоб підтримати це, argmaxповертає згладжені y-значення.)


Цей підхід має ряд переваг перед більш формальним моделюванням для роботи загального призначення:

  • Він не приймає жодної заздалегідь продуманої моделі даних.

  • Він може бути адаптований до характеристик даних.

  • Він може бути адаптований для виявлення видів піків, які вас цікавлять.


3
Навпаки, @Michael: Я не припускаю нічого про періодичність. Дійсно, приклад виглядає періодично, але це не так: зауважте квадратичний термін. Гармонічна регресія не вдасться з цим прикладом (і з багатьма іншими подібними серіями). Більше того, я нічого не вибираю «візуально»: це все робиться за алгоритмом. (Чому у мене складається сильне враження, що ви насправді не прочитали цю відповідь?)
whuber

1
Я можу знайти піки алгоритмічно за допомогою першого і другого тестів на похідні, тоді як вам потрібно використовувати інші засоби (можливо, щось на зразок числового пошуку). Моя думка полягала не в тому, щоб намагатися стверджувати, що один підхід був кращим за інший, і я взагалі не критикував вашу відповідь. Я просто бачу багато подібності та кілька відмінностей, і я намагався зрозуміти, як ви визначаєте свої вершини.
Майкл Черник

3
@Michael Піки - це місця, які не перевищують рухомий максимум; це робить їх швидкими та простими в обчисленні: немає чисельного пошуку, просто просте сканування . Перевага використання диференційованого гладкого полягає в тому, що він може інтерполювати піки між заданими значеннями x: це корисно для грубих або нерівномірних роздільних можливостей x. O(n)
whuber

4
@Michael, якщо ви не "встигнете" прочитати відповідь / коментар, тоді ви можете розглянути можливість утримуватися від відповіді на / публікації тверджень про публікацію. Це те, що ви робили неодноразово, і це часто призводить до неконструктивних обмінів та / або ви робите невірні заяви, які пізніше відкликаєте. Це здається марною тратою свого часу та інших людей, з якими ви берете участь у таких розмовах. Наприклад, на всю цю тему коментарів, безумовно, знадобилося більше часу, ніж просто прочитати відповідь. Чому ви вирішили використовувати сайт таким чином, продовжує мене спантеличувати. Я не бачу, як це комусь приносить користь.
Макрос

2
Дякую за цікавий підхід. Я думаю, що я також розумію те, до чого досягався Майкл: вам потрібно було переглянути діаграми, щоб визначити найкращі значення для wта span, а також виявити, що більш високі значення spanзміщували вершини. Схоже, навіть ці кроки можна автоматизувати. Наприклад, для першого питання, якби ми могли оцінити якість виявлених піків, ми могли б працювати optimizeза параметрами! Для другого питання, наприклад, виберіть вікно з будь-якої сторони виявленої вершини та шукайте більш високі значення.
Даррен Кук

1

Як я згадував у коментарі, якщо часовий ряд видається періодичним, що відповідає гармонічній регресійній моделі, це спосіб згладити функцію та визначити пік, застосовуючи перший та другий тести на похідні. Юбер вказав на непараметричний тест, який має переваги, коли є кілька піків, і функція не обов'язково періодична. Але безкоштовного обіду немає. Незважаючи на те, що є його переваги в тому, що він зазначає, можуть бути і недоліки, якщо параметрична модель підходить. Це завжди зворотний бік до використання непараметричних прийомів. Хоча це дозволяє уникнути параметричних припущень, параметричний підхід краще, коли параметричні припущення є відповідними. Його процедура також не повністю використовує структуру часових рядів у даних.

Я думаю, що, хоча доречно вказати на переваги запропонованої процедури, важливо також вказати на потенційні недоліки. І мій підхід, і Губер знаходять піки ефективно. Однак я думаю, що його процедура потребує трохи більше роботи, коли локальний максимум нижчий за раніше визначений найвищий пік.


2
Чи можете ви продемонструвати "ефективний спосіб" вашого підходу? Частина завдання полягає в тому, щоб розробити алгоритм пошуку декількох піків - що у вашому випадку означає знайти всі нулі (дорого обчисленої) похідної, а не лише один нуль - і чітко визначити, до якого з цих критичних моментів ви класифікуєте. як "піки", а які ні. Також було б добре підтримати або посилити ваше твердження про те, що "параметричний підхід є кращим, коли параметричні припущення є відповідними" було б добре, оскільки, як ми всі знаємо, параметричні припущення ніколи не бувають правильними.
whuber

@whuber Я сказав, що ви б відповідали моделі тоді, оскільки мод є сумою синусів і косинусів, функція періодична, піки виникають, коли і перша похідна дорівнює нулю, а друга похідна в нульовій точці зменшується. Це я мав на увазі, коли я сказав, що ви берете перший і другий похідні тести. Тепер ви можете вирішити, щоб знайти всі рішення, але якщо у вас один пік, інші - один період і кілька періодів від рішення, яке у вас є. Моя думка - не вимагати переваги методу. Я просто хочу зазначити, що безкоштовного обіду немає.
Майкл Черник

Непараметричні методи мають перевагу в тому, що вони не потребують припущення щодо моделювання, в цьому випадку не передбачають періодичності. Моє твердження про те, що параметричні підходи є кращими, ніж непараметричні підходи, коли допущення моделювання мають бути дуже відомими для вас. Мені не потрібно сперечатися з приводу параметричних припущень, які ніколи не відповідають дійсності. Це думка, з якою я в основному згоден. Але я говорю про щось на кшталт ефективності Пітмена. Непараметричні оцінки не настільки ефективні, як параметричні оцінки, коли модель "правильна".
Майкл Черник

Це теорія. На практиці параметричні моделі можуть бути хорошими наближеннями до реальності. У цьому випадку параметрична оцінка (скажімо, мле) є більш ефективною, ніж непараметрична оцінка. Також параметричні довірчі інтервали будуть кращими, оскільки вони будуть жорсткішими. Але багато разів ви не знаєте, наскільки хороша параметрична модель для вашого прикладу. У таких випадках вам доведеться вирішити між консерватизмом (бути безпечним) з непараметричним підходом або бути сміливим (і, можливо, неправильним), використовуючи параметричний підхід.
Майкл Черник

1
Що я намагаюся запропонувати, Майкл, полягає в тому, що в цьому випадку непараметричний підхід, ймовірно, буде набагато кращим, ніж будь-який параметричний підхід, за винятком випадків, коли дані особливо чітко підходять до моделі - і навіть тоді він буде добре працювати. Припустимо, що періодичність є чудовим прикладом: ваш алгоритм буде робити помилки такого ж порядку, що й відхилення від періодичності в межах даних. Можливість помилок зводить нанівець будь-які переваги, що надаються більшою асимптотичною ефективністю. Використання такої процедури без проведення спочатку великого тестування на GoF було б поганою ідеєю.
whuber

1

Класичний підхід до виявлення піку в обробці сигналів такий:

  1. Фільтр сигналу до певного розумного діапазону, залежно від частоти дискретизації та властивостей сигналу, наприклад, для ЕКГ, смугового фільтра IIR при 0,5-20 ГГц, фільтр нульового фази забезпечить, щоб не було введено зсув фаз (і пов'язаний з ними часовий відставання).
  2. Потім можна підкреслити перетворення Гільберта або вейвлет для підкреслення піків
  3. Потім може бути застосований статичний або динамічний поріг, де всі зразки вище порогу вважаються піками. У випадку динамічного порогу він зазвичай визначається як поріг N стандартних відхилень вище або нижче середньої ковзної середньої оцінки.

Інший підхід, який працює, полягає в порівнянні різко відфільтрованого високошвидкісного сигналу з сильно згладженим (низькопрохідним або серединним відфільтрованим) і застосувати крок 3.

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.