Як я можу програмно виявити сегменти серії даних, щоб вони відповідали різним кривим?


14

Чи існують якісь задокументовані алгоритми для розділення розділів даного набору даних на різні криві, що найкраще підходять?

Наприклад, більшість людей, які дивляться на цю діаграму даних, легко поділяють її на 3 частини: синусоїдальний сегмент, лінійний сегмент і зворотний експоненціальний сегмент. Насправді я зробив саме це з синусоїдою, лінією та простою експоненціальною формулою.

Діаграма з видимими трьома різними частинами

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

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

Оновлення: Ось зображення невеликого фрагмента реальних даних: Діаграма реального світу

Оновлення 2: ось незвичайно невеликий набір реальних даних (лише 509 точок даних):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

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

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

Однак у нас є одна розкіш - це задні уявлення: дані в моєму випадку - це не часовий ряд, а досить просторовий; має сенс аналізувати цілий набір даних (зазвичай 5000 - 15000 точок даних) одразу, а не постійно.


1
ps перший пост до резюме; Я розробник програмного забезпечення і, як правило, більше спілкуюся на SO. Вибачте, якщо я порушив якісь місцеві табу. Багато моїх пошуків відповідей привели сюди, тому я подумав, що це найкраще місце для запитання.
whybird

Чому ви не опублікуєте дані, і я спробую відповісти на ваше запитання на прикладі.
IrishStat

Однією з можливостей було б одразу підігнати все сімейство кривих, використовуючи мета-модель. Щоб зробити речі більш точними, припустімо, що ваша кінцева мета - згладити цю гістограму, скажімо, за допомогою KDE. Тоді ваше плавне оцінювання з KDE буде більш точним, якщо ви використовуєте модель, в якій ширині ядра дозволяється змінюватися в межах діапазону значень як у використаній тут моделі , рівняння (2) - (3)х
user603

1
Ви побудували приклад так, що ідея має сенс: поки що, так добре. З реальними гістограмами набагато частіше зустрічається, що складна форма відображає суміш перекритих розподілів: інтерес полягає не в точках зміни спостережуваної гістограми, які, як правило, не є переконливими або не є правильним способом думати про суміші. Однак можливо, ви використовуєте "гістограму" набагато ширше, ніж це є стандартним у статистичній науці, де це означає лише смугу діаграми частоти чи розподілу ймовірностей (лише).
Нік Кокс

@IrishStat - звичайні набори даних містять від 5000 до 15000 записів. Я намагався тут підготувати резюмований реальний, але це виявилося поганим прикладом, і мені довелося почати все спочатку. З іншого боку, це робило для мене часткову відповідь з точки зору простого згладжування та усереднення згустків даних для пошуку спочатку шаблонів, щоб потім було доопрацьовано, тож спасибі за це :) У мене справжній такий, що шириною лише 509, схоже, це може бути добре; Я додам це до питання, коли зможу.
whybird

Відповіді:


2

Моє тлумачення питання полягає в тому, що ОП шукає методології, які б відповідали формі (з) наданих прикладів, а не залишків HAC. Крім того, бажані автоматизовані процедури, які не потребують значного втручання людини або аналітика. Бокс-Дженкінс може виявитися невідповідним, незважаючи на їх акцент у цій темі, оскільки вони вимагають значного залучення аналітиків.

Для цього типу немоментного узгодження шаблонів існують R модулі. Кластеризація перестановки перестановок - така методика відповідності шаблону, розроблена вченим Інституту Макса Планка, яка відповідає критеріям, які ви окреслили. Його застосування стосується даних часових рядів, але це не обмежується. Ось цитування розробленого модуля R:

pdc: Пакет R для кластеризації часових рядів на основі складності від Андреаса Брандмаєра

Крім PDC, є машинне навчання, iSax рутина, розроблена Еймоном Кеогом в UC Irvine, що також варто порівняти.

Нарешті, є цей документ про розгром даних: розкриття прихованого порядку в данихЧаттопадхей та Ліпсон. Поза розумним титулом є серйозна мета в роботі. Ось конспект: "Від автоматичного розпізнавання мовлення до виявлення незвичних зірок, що лежать в основі майже всіх завдань автоматизованого виявлення, - це можливість порівнювати та протиставляти потоки даних один з одним, ідентифікувати з'єднання та виявляти потоки даних. Незважаючи на поширеність даних, однак автоматизовані методи Ключовим вузьким місцем є те, що сьогодні більшість алгоритмів порівняння даних покладаються на експерта людини, щоб визначити, які "особливості" даних є релевантними для порівняння. Тут ми пропонуємо новий принцип оцінки схожості між джерелами довільного використання потоки даних, не використовуючи ні доменних знань, ні навчання. Ми демонструємо застосування цього принципу для аналізу даних з ряду реальних складних проблем, включаючи розрізнення моделей електроенцефалографа, що стосуються епілептичних припадків, виявлення аномальної серцевої діяльності за допомогою звукових записів та класифікацію астрономічних об'єктів із сирої фотометрії. У всіх цих випадках і без доступу до будь-яких доменних знань ми демонструємо ефективність нарівні з точністю, досягнутою спеціалізованими алгоритмами та евристикою, розробленими експертами з домену. Ми пропонуємо, що принципи розбиття даних можуть відкрити двері до розуміння все складніших спостережень, особливо коли експерти не знають, на що звернути увагу ". У всіх цих випадках і без доступу до будь-яких доменних знань ми демонструємо ефективність нарівні з точністю, досягнутою спеціалізованими алгоритмами та евристикою, розробленими експертами з домену. Ми пропонуємо, що принципи розбиття даних можуть відкрити двері до розуміння все складніших спостережень, особливо коли експерти не знають, на що звернути увагу ". У всіх цих випадках і без доступу до будь-яких доменних знань ми демонструємо ефективність нарівні з точністю, досягнутою спеціалізованими алгоритмами та евристикою, розробленими експертами з домену. Ми пропонуємо, що принципи розбиття даних можуть відкрити двері до розуміння все складніших спостережень, особливо коли експерти не знають, на що звернути увагу ".

Цей підхід виходить за рамки криволінійної форми. Варто перевірити.


Дякую - ви праві, що я хочу знайти кластери автоматично, без втручання аналітика. Для того, що я хочу зробити для роботи, мені потрібно буде розбити набори даних 5000-15000 точок даних на кластери, кожен з яких добре відповідає простим формулам (включаючи повторювані) без втручання людини в групи близько 50000 таких наборів даних у терміни, допустимі людьми на побутовому комп'ютерному обладнанні.
whybird

Що стосується того, яка крива підходить до кожного кластеру, то коли я виявив межі будь-якими способами, це досить просто, я думаю просто спробувати різні моделі (синусоїда, поліном, експоненція) і побачити, що дає кращий звичайний r ^ 2.
whybird

2
Гаразд, я думаю, що зловживання виникає саме з цього: Sax та iSax - це формати подання для зберігання та обробки часових рядів, вони не є кластеризацією або алгоритмами виявлення сегментів / шаблонів (на посаду ОП). З моєї відповіді я зрозумів, що Кеог придумав алгоритм, який ґрунтується на форматі представлення SAX, і він вирішує проблему ОП. Але я думаю, що це не те, що ви мали на увазі?
Жубарб

2
Гаразд, немає необхідності звертатися до Keogh, я знаю про iSax та Sax , вони є форматами представлення для ефективного видобутку часових рядів. Посилання пояснюють їх. iSax - новіша версія. Мене схвилювало моє нерозуміння вашої відповіді, звідси і запитання (не намагаючись бути педантичним) :).
Жубарб

2
я нічого не намагався приховати, я інтерпретував «ісакс рутину» як алгоритм, що працює на isax. Я вважаю, що ваша відповідь потребує переформулювання / модифікації після уточнення.
Жубарб

2

Виявлення точок зміни у часовому ряду вимагає побудови надійної глобальної моделі ARIMA (безумовно, дефектної зміни моделей та змін параметрів у часі у вашому випадку), а потім виявлення найбільш суттєвої точки зміни параметрів цієї моделі. Використовуючи ваші значення 509, найзначнішою точкою зміни було близько 353 року. Я використовував деякі власні алгоритми, доступні в AUTOBOX (які я допоміг розробити), які, можливо, можуть бути ліцензовані для вашої спеціалізованої програми. Основна ідея полягає в тому, щоб розділити дані на дві частини і після знаходження найважливішої точки зміни повторно проаналізувати кожен з двох часових діапазонів окремо (1-352; 353-509), щоб визначити подальші точки зміни у кожному з двох наборів. Це повторюється, поки у вас не буде k підмножини. Я додав перший крок, використовуючи такий підхід.введіть тут опис зображення

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


Чому 353 отримують позначення, коли 153 і 173 мають нижчі значення P?
Нік Кокс

@NickCox Добре запитання! Чудовий коментар. Для цілей прогнозування вся ідея полягає у відокремленні останнього (значного) підмножини від старого підмножини, тому 353 виграли .... Для цілей тут дійсно слід вибрати 173.
IrishStat

Заголовок "НАЙБІЛЬШИЙ
НАЙКРАЩИЙ ЗНАЧЕНИЙ ПОЛІТИЧНИЙ

Дякую! Це дійсно цікаво і дуже цінується. Я можу зв’язатися з вами для отримання більш детальної інформації.
whybird

Дякую за пояснення: ідея дійсно чітка в останній записці. (до речі, я не бачив так багато ВИПУСКУ в справі випуску програм приблизно з початку 1990-х. Я б рекомендував змінити "рівень 95% довіри" на "5% рівень значущості", якщо вважати, що саме так мається на увазі.)
Нік Кокс

2

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

Як згадує Роб Хайндман у цьому посиланні, R пропонує пакет змін для цієї мети. Я розігрувався з вашими даними, але мушу сказати, що результати є непомітними [чи справді перша точка даних 4 чи повинна бути 54?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

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

library(forecast)
auto.arima(raw)

що дає вам найкращу модель ARIMA.


Дякую! Я відредагував слово "гістограма" з назви; Спочатку я його неправильно застосував, і забув редагувати заголовок, коли видаляв його з тіла в попередньому редагуванні у відповідь на коментар.
whybird

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

Перша точка даних у цьому прикладі насправді є 4, але цілком може бути так, що ми потрапили в кінець попередньої структури або, можливо, це був шум; Я був би радий залишити це як чужий, але будь-яка система, яку я придумаю, повинна впоратися і з подібними речами.
whybird

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