Прилаштовують кусково-лінійні дані


18

Що є надійним способом пристосування до кускових лінійних, але галасливих даних?

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

Набір даних складається з декількох тисяч точок, з 1-10 сегментами, і я знаю кількість сегментів.

Це приклад того, що я хотів би зробити автоматично.

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


Я не думаю, що на це питання можна відповісти обґрунтовано, якщо ви не скажете нам, наскільки точно ви хочете дізнатися місця розривів, яка ваша здогадка для найменшої довжини лінійного відрізка та скільки зразків у типовому перехідний регіон. Якщо мітки горизонтальної осі на вашій фігурі є зразковими номерами, то з двома переходами в проміжку від до x [ 0 ] завдання складніше, ніж якби прямолінійні відрізки мали більшу тривалість (у зразки). х[-5]х[0]
Діліп Сарват

@DilipSarwate Я оновив питання з вимогами (btw xaxis - це магнітне поле в
теслі

Ви можете спробувати цей інструментарій, якщо ви працюєте з інструментом для встановлення кривих
Rhei

Відповіді:


12

Я спробував два підходи, наївно (використовуючи лише 3 сегменти). Зрозуміло, там будуть більш химерні методи.

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

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

    Встановити кусково-лінійну модель, використовуючи мінімізатор загального призначення. Це легко забезпечити безперервність сегментів. Цікаво, що тестування на залишки та інші властивості може надати достатньо інформації для автоматичного визначення кількості сегментів - я цього не намагався. Ось як це виглядає в Mathematica:

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


Схоже, чудова відповідь. Дякуємо за ваш внесок.
Джейсон R

7

Я не стверджую, що наступний метод є надійним, але він може працювати для вас. З тисячами точок та, можливо, десятьма чи більше прямими відрізками, поступайте так.х[н]

  • Обробіть точки щоб створити бітовий масив y [ n ] наступним чином. y [ n ] = { 1 , якщо | ( x [ n + 1 ] - x [ n ] ) - ( x [ n ] - x [ n - 1 ] ) | < ϵ , 0 , інакше. Осьх[н]у[н]

    у[н]={1,якщо |(х[н+1]-х[н])-(х[н]-х[н-1])|<ϵ,0,інакше.
    ϵх[н-1],х[н],х[н+1](н-1,х[н-1])(н,х[н])має майже такий же нахил, що і пряма через та ( n + 1 , x [ n + 1 ] ) .(н,х[н])(н+1,х[н+1])
  • Якщо - це масив з десяти або довгих тривалих пробігів у 1 с, розділених пробіжками 0 с з випадковими бродячими 1 с тут і там, щоб позначити красу, відпочити, ви на правильному шляху. В іншому випадку, якщо є занадто мало пробіжок або занадто багато запусків за 1 с, повторіть попередній крок з іншим ϵ .у[н]1011ϵ

  • у[н]х[3]х[88]х[94]х[120]х[129], і так далі. Простягніть A вправо і B вліво, щоб дізнатися, де вони перетинаються; продовжте B вправо і C вліво, щоб дізнатися, де вони перетинаються і т. д. Вітаємо, тепер у вас є безперервна і кусочно лінійна модель для ваших даних.


Тотально вкрав мою відповідь! =)
Phonon

Інтересуюча ідея, але, на жаль, через шум сигналу я не отримую хороших результатів.
P3trus

1
Цей вираз, величина якого порівнюється з епсилоном, насправді є наближенням до другої похідної даних. Є й інші способи обчислити це, використовуючи більше трьох точок, які не реагують на шум так сильно. Подивіться на Савіцького-Голая.
DarenW

4

(Роками пізніше) кусково-лінійні функції - це сплайни 1-го ступеня, які можна сказати більшості слюсарів. Наприклад, scipy.interpolate.UnivariateSpline може бути запущений k=1 та згладжуючий параметр s, з яким вам доведеться грати - див. scipy-interpolation-with-univariate-splines .
У Matlab дивіться, як вибрати вузли .

Додано: знайти оптимальні вузли непросто, оскільки місцевих оптимів може бути багато. Натомість ви даєте UnivariateSpline ціль s, суму помилки ^ 2, і дозволите їй визначити кількість вузлів. Після установки, get_residual()ви отримаєте фактичну суму помилки ^ 2 та get_knots()вузлів. Невелика зміна sможе сильно змінити вузли, особливо при високому шумі - ymmv.
Сюжет показує пристосування до випадкової кусочно-лінійної функції + шум для різних s.

Докладніше про встановлення постійних констант див. У розділі Виявлення кроків . Чи можна це використовувати для pw лінійних? Не знаю; починаючи з диференціації галасливих даних, підвищить рівень шуму, неправильно.

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


Додано березень 2014 року: Динамічне програмування - це загальний метод для проблем із вкладеними підпроблемами, як це:

optimal k lines
    = optimal k - 1 lines up to some x
    + cost of the last line x to the end
over x  (all x in theory, nearby x in practice)

Динамічне програмування є дуже розумним, але чи може він перемогти грубу силу + евристику для цього завдання?
Дивіться чудові записки курсу Еріка Демейна в розділі MIT 6.006. Вступ до алгоритмів
також розрізненої лінійною регресією Google,
також синдром Джона Генрі.


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


Проблема, принаймні, з сципією, - це розташування вузлів. scipy використовує рівновіддалені вузли.
P3trus

@ P3trus, так для початку, але потім вони можуть рухатися - дивіться сюжет. У будь-якому випадку він орієнтований на повну помилку, а не на вузли.
denis

@ P3trus Ви пробували використовувати метод багатоваріантної регресії сплайсів, який автоматично вибирає точки перелому ітеративно? cs.rtu.lv/jekabsons/regression.html
Atul Ingle

@Atul Ingle, вибір точки зупинки / вузлів afaik - це та сама проблема, з будь-якого монтажу сплайну. Якщо ви знаєте різні алгоритми для цього від людей, які працюють з регресією, чи можете ви опублікувати посилання, будь ласка?
denis

Шукаєте пакети в R / Matlab, які роблять адаптивну регресію? Ось: cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html, а також ARESLab в Matlab, на який я вже розмістив посилання.
Atul Ingle

0

Візьміть похідну і шукайте області майже постійного значення. Вам потрібно створити алгоритм для пошуку тих областей з ідеально деяким рівнем +/- нахилу, і це дасть вам нахил лінії для цього розділу. Можливо, ви захочете виконати деяке згладжування, наприклад, середнє ковзання, перш ніж робити класифікацію секцій. Наступним кроком було б отримати y-перетин, який повинен бути тривіальним у цій точці.


похідне може бути неприємним шумом. я не думаю, що я б рекомендував це.
Роберт Брістоу-Джонсон

0

Використання фільтра трендів l1 - ще одна ідея:

Папір

Приклад онлайн


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