Подгонка кусочно-линейных данных

18

Что такое надежный способ размещения кусочно-линейных, но шумных данных?

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

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

Это пример того, что я хотел бы сделать автоматически.

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

P3trus
источник
Я не думаю, что на этот вопрос можно ответить разумно, если вы не скажете нам, насколько точно вы хотите знать расположение точек останова, каково ваше предположение для самой короткой длины линейного сегмента и сколько выборок в типичном переходный регион. Если метки горизонтальной оси на вашем рисунке являются номерами выборок, то с двумя переходами в диапазоне от до задача будет более сложной, чем если бы отрезки прямых были более продолжительными (в образцы). x[5]x[0]
Дилип Сарвате
@DilipSarwate Я обновил Вопрос с требованиями (кстати, xaxis - это магнитное поле в теслах)
P3trus
Вы можете попробовать этот набор инструментов, если вы работаете с набором инструментов
Rhei

Ответы:

12

Я попробовал два подхода, наивно (используя только 3 сегмента). Конечно, там были бы более причудливые методы.

    RANSAC, должен быть надежным механизмом подгонки. Алгоритм легко остановить после нескольких сегментов. Однако может быть трудно обеспечить непрерывность между сегментами - как это требуется в вашем приложении - по крайней мере, с простой реализацией. В качестве доказательства концепции я создал изображение из точек данных, чтобы я мог использовать механизм RANSAC, доступный в , функции обнаружения линий Mathematica.ImageLines

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

    Установите кусочно-линейную модель, используя минимизатор общего назначения. Легко обеспечить непрерывность сегментов. Интересно, что тестирование на наличие остатков и других свойств может предоставить достаточно информации для автоматического определения количества сегментов - хотя я этого не пробовал. Вот как это выглядит в Mathematica:

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

Матиас Одисио
источник
Похоже, отличный ответ. Спасибо за помощь.
Джейсон Р
7

x[n]

  • x[n]y[n]

    y[n]={1,if |(x[n+1]x[n])(x[n]x[n1])|<ϵ,0,otherwise.
    ϵx[n1],x[n],x[n+1](n1,x[n1])(n,x[n])(n,x[n])(n+1,x[n+1])
  • Y[N]1011ε

  • Y[N]Икс[3]x[88]x[94]x[120]x[129], и так далее. Расширьте A вправо и B влево, чтобы узнать, где они пересекаются; продлить B вправо и C влево, чтобы узнать, где они пересекаются и т. д. Поздравляем, теперь у вас есть непрерывная и кусочно-линейная модель для ваших данных.

Дилип Сарватэ
источник
Полностью украл мой ответ! =)
Фонон
Интересная идея, но, к сожалению, из-за шума в сигнале я не получаю хороших результатов.
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 линейного? Не знаю; если начать с дифференциации данных с шумом, это увеличит шум, не так.

Другие тестовые функции, и / или ссылки на документы или код, будут приветствоваться. Пара ссылок:
кусочно-линейная-регрессия-с-узлами-параметрами
Линейные сплайны очень чувствительны к тому месту, где расположены узлы сплайны
knot-selection-for-cubic-regression-splines
Это сложная проблема, и большинство людей просто выбирают узлы методом проб и ошибок.
Один из подходов, который становится все более популярным, - использовать вместо этого штрафные сплайны регрессии.


Добавлено март 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
и синдром Джона Генри.


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

Денис
источник
Проблема, по крайней мере, со скупи - это расположение узлов. Сципи использует равноправные узлы.
P3trus
@ P3trus, да для начала, но потом они могут двигаться - смотрите сюжет. В любом случае он нацелен на полную ошибку, а не на узлы.
Денис
@ P3trus Вы пытались использовать метод многомерных регрессионных сплайнов, который автоматически выбирает точки останова итеративно? cs.rtu.lv/jekabsons/regression.html
Atul Ingle
@Atul Ingle, выбор точки останова / узла afaik - та же проблема, что и у любого установщика сплайнов. Если вы знаете разные алгоритмы R / регрессии, не могли бы вы опубликовать ссылку, пожалуйста?
Денис
Ищете пакеты в R / Matlab, которые делают адаптивные сплайны регрессии? Здесь: cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html, а также ARESLab в Matlab, для которого я уже разместил ссылку.
Атул Ингл
0

Возьмите производную и ищите области почти постоянного значения. Вам нужно будет создать алгоритм для поиска областей с идеальным уровнем +/- наклона, и это даст вам наклон линии для этого раздела. Возможно, вы захотите выполнить некоторое сглаживание, например скользящее среднее, перед выполнением секционной классификации. Следующим шагом будет получение y-пересечения, которое в этот момент должно быть тривиальным.

Porten
источник
производная может быть шумной. я не думаю, что рекомендую это.
Роберт Бристоу-Джонсон
0

Использование трендового фильтра l1 - еще одна идея:

Бумага

Пример в Интернете

SeanVN
источник
1
Ваш ответ слишком короток, чтобы быть конструктивным! Пожалуйста, подумайте над тем, чтобы приложить усилия, чтобы расширить его педагогическим путем.
Sansuiso