Эффективное вычисление сегментированной регрессии на большом наборе данных

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

В настоящее время у меня есть следующий подход:

  • Пусть si будет концом отрезка i
  • Пусть (xi,yi) обозначает i-ю точку данных

Предположим, что точка данных xk находится в сегменте j, тогда я могу создать вектор из xk как

(s1,s2-s1,s3-s2 ,...,xk-sj-1,0,0,...)

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

Однако мои текущие оценки показывают, что если я поставлю задачу таким образом, я получу около 600 000 векторов, каждый из которых содержит около 2 000 компонентов. Я еще не проводил бенчмаркинг, но не думаю, что мой компьютер сможет вычислить такую ​​большую задачу регрессии за приемлемое время.

Есть ли лучший способ вычислить такую ​​проблему регрессии? Одна идея заключалась в том, чтобы, возможно, использовать какой-то иерархический подход, то есть вычислить одну задачу регрессии, объединив несколько сегментов, чтобы я мог определить начальную и конечную точки для этого набора. Затем вычислите индивидуальную сегментированную регрессию для этого набора сегментов. Однако я не могу понять, как рассчитать регрессию для этого набора сегментов, чтобы конечные точки совпадали (я могу сопоставить только начальную или конечную точку, зафиксировав точку пересечения, но не обе).

Еще одна идея, которая у меня была, заключалась в том, чтобы рассчитать индивидуальную регрессию для каждого из сегментов, а затем использовать наклон только для этого сегмента. Однако при таком подходе могут начать накапливаться ошибки, и у меня нет возможности контролировать такое накопление ошибок.

Еще одна идея заключается в том, что я мог бы выполнить индивидуальную регрессию для каждого сегмента, но зафиксировать точку пересечения в конечной точке предыдущего сегмента. Тем не менее, я все еще не уверен, смогу ли я таким образом получить какое-то накопление ошибок.

Пояснение

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

ИЗМЕНИТЬ

Может быть, еще один факт, который мог бы помочь. Все точки имеют разные значения x.


person LiKao    schedule 24.03.2015    source источник
comment
сколько точек на сегмент в среднем и минимальном?   -  person Spektre    schedule 24.03.2015
comment
В каждом сегменте должно быть около 300 точек. Если подумать еще немного о проблеме, на самом деле могут быть некоторые сегменты без точек. Раньше я думал установить сегменты так, чтобы в них всегда были какие-то точки, но я только что заметил, что я могу соединять некоторые части, которые могут иметь разный наклон.   -  person LiKao    schedule 24.03.2015


Ответы (1)


Я бы сгруппировал точки в прямоугольные области сетки

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

Я бы обрабатывал каждую группу следующим образом:

  1. вычислить гистограмму углов

  2. брать только наиболее часто встречающиеся углы

    их количество определяет количество сегментов линии, присутствующих в группе

  3. соответствует ли регрессия/линия этим углам

    См. этот ответ, он делает что-то очень похожее (только одна строка)

  4. вычислить точки пересечения

    между сегментами линии, чтобы получить конечные точки вашей кусочной полилинии, а также информацию о связности (присоединиться к ближайшим конечным точкам)

[edit1] после редактирования OP

Вы знаете координаты края x всех сегментов (x0,x1,...), поэтому просто вычислите средние y координаты точек вблизи края сегмента (серая область, зеленые точки), и вы получите конечные точки линии сегмента (синие точки). Грубо говоря, это не подгонка или регрессия из-за того, что все остальные точки отбрасываются, поэтому это приводит к большим ошибкам (если только сегмент x не соответствует регрессионным линиям...), но нет никакого способа обойти это с ограничениями решения, которое у вас есть ( по крайней мере я не вижу).

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

пример

размер серой области определяет результат... так что немного поиграйте с ним...

person Spektre    schedule 24.03.2015
comment
Я не уверен, что правильно понимаю. Насколько я понимаю, этот метод пытается найти полилинию, которая лучше всего соответствует набору точек, но ни одна из координат вершин не известна. Верно ли это понимание? Однако для моих данных мне нужно, чтобы вершины находились в фиксированной координате x. Отсюда подход сегментированной регрессии, который гарантирует, что сегменты встречаются в координатах x вершин. Если я вычислю наклоны каждого сегмента по отдельности, они могут встретиться в разных координатах x. - person LiKao; 24.03.2015
comment
@LiKao эта линия / ось поиска соответствует облаку точек, затем вам нужно соединить все найденные линии вместе на основе расстояний до конечных точек ... кстати, ваши данные являются функцией или нет (следовательно, возможно ли больше значений y для одного x?) пример ввод данных будет в порядке (2D-график) - person Spektre; 24.03.2015
comment
@LiKao после прочтения вашего редактирования я обновил свой ответ (надеюсь, я правильно понял) - person Spektre; 24.03.2015
comment
Я думал о подобном решении и раньше... Однако я еще не следовал ему, потому что ошибка для точек вблизи границы сегмента сильно усиливается с помощью этого метода. Думаю, мне придется попробовать разные методы на небольшом наборе данных и посмотреть, как они сравниваются. - person LiKao; 25.03.2015
comment
Также за ваш комментарий, если вы используете регрессию для данных сегмента, вы не можете связать ее с другими сегментами. На самом деле это не такая уж большая проблема. Метод регрессии, который я объяснил в своем вопросе, легко соединяет сегменты, однако его использование слишком сложно. Я также могу легко итеративно вычислить сегменты, а затем соединиться с конечной точкой предыдущего или следующего сегмента (фиксируя точку пересечения), но не с предыдущей и следующей конечными точками одновременно. Также, если я делаю это, я беспокоюсь о стабильности. Ошибки могут накапливаться, и я не могу доказать, что их не будет. - person LiKao; 25.03.2015
comment
@LiKao, сколько там сегментов? с известным x конечных точек регрессия составляет всего O(n*log(a)*log(y)), где n – количество точек на сегмент (~300), a – возможные углы (наклоны... могут быть ограничены, например, 3600) и y возможные смещения ((ymax-ymin)/точность ) так что не так дорого. также вы можете использовать первую точку y как последнюю из предыдущего сегмента, а последний log будет отклонен... вы можете использовать примерно отсюда stackoverflow .com/q/29166819/2521214 - person Spektre; 25.03.2015
comment
Не уверен, как вы это получили (особенно часть журнала (a)). Насколько я понимаю, регрессия основана на вычислении псевдоинверсии матрицы. В моем случае матрица будет представлять собой количество сегментов X количество точек, то есть 2.000X600.000. Затем при вычислении псевдообратного используется алгоритм Гаусса, который работает за O (N ^ 3). Вы, кажется, имеете в виду какой-то другой метод регрессии. Сегментация и использование предыдущей конечной точки может привести к нестабильности (по крайней мере, я не могу доказать, что это не так). - person LiKao; 25.03.2015
comment
@LiKao нет ... вам нужно разделить каждый сегмент как единую регрессию/подгонку с точками только внутри своего интервала (или может быть + половина предыдущего и следующего сегмента), поэтому количество точек составляет ~ 300 или ~ 600, и теперь вы хотите найти прямую, ближайшую ко всем точкам... - person Spektre; 25.03.2015
comment
@LiKao, попробуйте all комбинации y(x)=y0+(x-x0)*(y1-y0)/(x1-x0), так что только y0, y1 являются неизвестными ... и (y1-y0)/(x1-x0)=tan(angle), но вы можете попробовать не все комбинации, а аппроксимировать подходом, подобным разделению и влиянию (по моему примерному классу или CCD или чему-то еще), поэтому вместо m попыток для каждой переменной, которую вы получили log(m) ... и внутри каждой попытки вы вычисляете среднее расстояние абс для всех точек от этой линии и сохраняете минимальное решение ... Я знаю его линейную подгонку вместо регрессии, но результат должен быть близок, если нет то же самое, но за гораздо меньшее время - person Spektre; 25.03.2015
comment
@LiKao то, что вы описываете, выглядит как полиномиальная регрессия / подгонка высокого порядка (не сегментированная линия ...) - person Spektre; 25.03.2015