(Спустя годы) кусочно-линейные функции - это сплайны степени 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
и синдром Джона Генри.