Как программно определить сегменты ряда данных, чтобы они соответствовали различным кривым?


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

Икс

1
Вы построили пример так, чтобы идея имела смысл: пока все хорошо. С реальными гистограммами гораздо чаще встречается сложная форма, представляющая собой смесь перекрывающихся распределений: тогда интерес не в точках изменения наблюдаемой гистограммы, которые обычно не существуют убедительно или не являются правильным подходом к размышлениям о смесях. Возможно, однако, что вы используете «гистограмму» в гораздо более широком смысле, чем стандартная в статистической науке, где это означает гистограмму распределения частоты или вероятности (только).
Ник Кокс,

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

Ответы:


2

Моя интерпретация вопроса заключается в том, что ФП ищет методологии, которые бы соответствовали форме (ам) представленных примеров, а не остаткам ВАК. Кроме того, желательны автоматизированные процедуры, которые не требуют значительного вмешательства человека или аналитика. Бокс-Дженкинс может не подойти, несмотря на то, что они подчеркивают эту тему, поскольку они требуют значительного участия аналитиков.

Модули R существуют для этого типа не основанного на моментах сопоставления с образцом. Кластеризация распределения перестановок - это такая методика сопоставления с образцом, разработанная учёным из Института Макса Планка, которая соответствует указанным вами критериям. Его применение - данные временных рядов, но это не ограничивается этим. Вот цитата для модуля R, который был разработан:

pdc: пакет R для кластеризации временных рядов на основе сложности, автор Andreas Brandmaier

В дополнение к PDC, есть машинное обучение, рутина iSax, разработанная Иамоном Кеогом из Калифорнийского университета в Ирвине, с которой также стоит сравнить.

Наконец, есть статья о разрушении данных: раскрытие скрытого порядка в данныхChattopadhyay и Lipson. Помимо умного названия, есть серьезная цель в работе. Вот аннотация: «От автоматического распознавания речи до обнаружения необычных звезд, в основе почти всех задач автоматического обнаружения лежит возможность сравнивать и сопоставлять потоки данных друг с другом, выявлять связи и выявлять выбросы. Однако, несмотря на преобладание данных, автоматизированные методы не отставать. Ключевым узким местом является то, что большинство алгоритмов сравнения данных сегодня полагаются на человека-специалиста, чтобы определить, какие «особенности» данных актуальны для сравнения. Здесь мы предлагаем новый принцип для оценки сходства между источниками произвольных потоки данных, не используя ни знания предметной области, ни обучение. Мы демонстрируем применение этого принципа к анализу данных из ряда реальных проблем, включая устранение неоднозначности моделей электроэнцефалографа, относящихся к эпилептическим припадкам, обнаружение аномальной сердечной деятельности по звукозаписи сердца и классификацию астрономических объектов по необработанной фотометрии. Во всех этих случаях и без доступа к каким-либо предметным знаниям мы демонстрируем производительность наравне с точностью, достигнутой специализированными алгоритмами и эвристиками, разработанными экспертами в предметной области. Мы предполагаем, что принципы разрушения данных могут открыть дверь для понимания все более сложных наблюдений, особенно когда эксперты не знают, что искать ». Во всех этих случаях и без доступа к каким-либо предметным знаниям мы демонстрируем производительность наравне с точностью, достигнутой специализированными алгоритмами и эвристиками, разработанными экспертами в предметной области. Мы предполагаем, что принципы разрушения данных могут открыть дверь для понимания все более сложных наблюдений, особенно когда эксперты не знают, что искать ». Во всех этих случаях и без доступа к каким-либо предметным знаниям мы демонстрируем производительность наравне с точностью, достигнутой специализированными алгоритмами и эвристиками, разработанными экспертами в предметной области. Мы предполагаем, что принципы разрушения данных могут открыть дверь для понимания все более сложных наблюдений, особенно когда эксперты не знают, что искать ».

Этот подход выходит далеко за пределы криволинейной подгонки. Это стоит проверить.


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

Что касается того, какая кривая должна соответствовать каждому кластеру, как только я определю границы любыми средствами, я думаю, что достаточно просто попробовать разные модели (синусоидальная, полиномиальная, экспоненциальная) и посмотреть, какая из них лучше обычного r ^ 2.
Whybird

2
Хорошо, я думаю, что недоразумение возникает из-за этого: Sax и iSax являются форматами представлений для хранения и обработки временных рядов, они не являются алгоритмами кластеризации или обнаружения сегментов / паттернов (согласно посту ОП). Насколько я понимаю из вашего ответа, Кео разработал алгоритм, основанный на формате представления SAX и предназначенный для решения проблемы ОП. Но я думаю, это не то, что вы имели в виду?
Жубарб

2
Хорошо, нет необходимости обращаться к Keogh, я знаю о iSax и Sax , они являются форматами представления для эффективного анализа временных рядов. Ссылки объясняют их. iSax - более новая версия. Я был взволнован моим непониманием вашего ответа, отсюда и вопросы (не пытаясь быть педантичными) :).
Жубарб

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

2

Обнаружение точек изменения во временном ряду требует построения надежной глобальной модели ARIMA (конечно, в вашем случае с ошибками модели и изменениями параметров с течением времени), а затем определение наиболее значимой точки изменения в параметрах этой модели. Используя ваши 509 значений, наиболее значимым моментом изменения стал период 353. Я использовал некоторые проприетарные алгоритмы, доступные в AUTOBOX (которые я помогал разрабатывать), которые могли бы быть лицензированы для вашего индивидуального приложения. Основная идея состоит в том, чтобы разделить данные на две части и после нахождения наиболее важной точки изменения провести повторный анализ каждого из двух временных диапазонов в отдельности (1-352; 353-509), чтобы определить дополнительные точки изменения в каждом из двух наборов. Это повторяется до тех пор, пока у вас не будет k подмножеств. Я приложил первый шаг, используя этот подход.введите описание изображения здесь

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


Почему 353 помечается, когда 153 и 173 имеют более низкие значения P?
Ник Кокс

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

Название «САМЫЕ ПОСЛЕДНИЕ
ЗНАЧИМЫЕ ПЕРЕРЫВНЫЕ

Спасибо! Это действительно интересно и высоко ценится. Я могу связаться с вами для уточнения деталей.
Whybird

Спасибо за объяснение: идея действительно четко изложена в последней заметке. (кстати, я не видел так много UPPER CASE в результатах программы примерно с начала 1990-х годов. Я бы порекомендовал изменить «уровень достоверности 95%» на «уровень значимости 5%», предполагая, что это означает.)
Ник Кокс

2

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

Как упоминал Роб Хиндман в этой ссылке, R предлагает пакет Strucchange для этой цели. Я поиграл с вашими данными, но должен сказать, что результаты разочаровывают [действительно ли первая точка данных равна 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.