У меня есть набор данных, который не упорядочен каким-либо конкретным способом, но при четком графике имеет две четкие тенденции. Простая линейная регрессия здесь не совсем подходит из-за четкого различия между двумя рядами. Есть ли простой способ получить две независимые линейные линии тренда?
Для справки: я использую Python, и я достаточно хорошо разбираюсь в программировании и анализе данных, включая машинное обучение, но готов перейти на R, если это абсолютно необходимо.
time-series
python
curve-fitting
jbbiomed
источник
источник
Ответы:
Чтобы решить вашу проблему, хорошим подходом является определение вероятностной модели, которая соответствует предположениям о вашем наборе данных. В вашем случае вам, вероятно, понадобится смесь моделей линейной регрессии. Вы можете создать модель «смеси регрессоров», аналогичную модели смеси Гаусса, связав разные точки данных с различными компонентами смеси.
Я включил некоторый код, чтобы вы начали. Код реализует EM-алгоритм для смеси двух регрессоров (его должно быть относительно легко распространить на большие смеси). Код кажется достаточно надежным для случайных наборов данных. Однако, в отличие от линейной регрессии, смешанные модели имеют невыпуклые цели, поэтому для реального набора данных может потребоваться провести несколько испытаний с разными случайными начальными точками.
источник
В другом месте в этой теме user1149913 предоставляет полезные советы (определяют вероятностную модель) и код для мощного подхода (оценка EM). Осталось решить две проблемы:
Как справиться с отклонениями от вероятностной модели (что очень очевидно в данных за 2011-2012 гг. И несколько очевидно в волнистости менее наклонных точек).
Как определить хорошие начальные значения для алгоритма EM (или любого другого алгоритма).
Чтобы обратиться к № 2, подумайте об использовании преобразования Хафа . Это алгоритм обнаружения признаков, который для нахождения линейных участков признаков может быть эффективно вычислен как преобразование Радона .
Чтобы начать работу с этими данными, я сначала обрезал вспомогательные элементы (оси, отметки и метки) и для хорошей цели обрезал явно отдаленные точки внизу справа и посыпал вдоль нижней оси. (Когда этот материал не обрезается, процедура все еще работает хорошо, но она также обнаруживает оси, кадры, линейные последовательности тиков, линейные последовательности меток и даже точки, время от времени лежащие на нижней оси!)
(Этот и остальной код приведены в Mathematica .)
Каждой точке на этом изображении соответствует узкий диапазон кривых в преобразовании Хафа, видимый здесь. Это синусоиды:
Это наглядно демонстрирует смысл, в котором вопрос представляет собой проблему линейной кластеризации : преобразование Хафа сводит его к проблеме точечной кластеризации , к которой мы можем применить любой метод кластеризации, который нам нравится.
В этом случае кластеризация настолько ясна, что достаточно простой постобработки преобразования Хафа. Чтобы определить места наибольшей интенсивности в преобразовании, я увеличил контраст и размыл преобразование по радиусу около 1%: это сопоставимо с диаметрами точек графика на исходном изображении.
Установление порога результата сузило его до двух крошечных сгустков, центроиды которых разумно идентифицируют точки наибольшей интенсивности: они оценивают подобранные линии.
Левая сторона изображения соответствует направлению 0 градусов (по горизонтали), и, как мы видим слева направо, этот угол увеличивается линейно до 180 градусов. Интерполируя, я вычисляю, что эти две капли центрированы в 19 и 57,1 градусах соответственно. Мы также можем считывать перехваты с вертикальных позиций капель. Эта информация дает начальные соответствия:
Аналогичным образом можно вычислить точки пересечения, соответствующие этим наклонам, давая следующие соответствия:
(Красная линия соответствует крошечной розовой точке на предыдущем изображении, а синяя линия соответствует большему водному шарику.)
В значительной степени этот подход автоматически решает первую проблему: отклонения от линейности размывают точки наибольшей интенсивности, но обычно не сильно их смещают. Откровенно говоря, отдаленные точки будут вносить низкий уровень шума во всем преобразовании Хафа, который исчезнет во время процедур последующей обработки.
В этот момент можно предоставить эти оценки в качестве начальных значений для алгоритма EM или для минимизатора вероятности (который, при наличии хороших оценок, будет быстро сходиться). Однако лучше было бы использовать надежную регрессионную оценку, такую как метод наименьших квадратов с повторным взвешиванием . Он способен обеспечить регрессионный вес для каждой точки. Низкие веса указывают, что точка не принадлежит линии. Используйте эти веса, если хотите, чтобы назначить каждую точку соответствующей линии. Затем, классифицировав точки, вы можете использовать обычные наименьшие квадраты (или любую другую процедуру регрессии) отдельно для двух групп точек.
источник
rotation
, которая изначально была установлена на ноль и поэтому не имела никакого значения.Я обнаружил, что этот вопрос связан с другим вопросом . Я действительно проводил академические исследования по этой проблеме. Пожалуйста, проверьте мой ответ "Наименьший квадратный корень" подходит? Подходящий метод с несколькими минимумами для более подробной информации.
Подход, основанный на преобразовании Хафа, является очень хорошим решением для простых сценариев, которые вы предложили. Я работал над сценариями с более сложными данными, такими как это:
Мои соавторы и я обозначили это как проблему «ассоциации данных». Когда вы пытаетесь ее решить, основная проблема обычно является комбинаторной из-за экспоненциального количества возможных комбинаций данных.
У нас есть публикация « Перекрывающиеся смеси гауссовских процессов для задачи об ассоциации данных », в которой мы подошли к общей проблеме N кривых с помощью итерационной техники, дающей очень хорошие результаты. Вы можете найти код Matlab, связанный в статье.
[Обновление] Реализацию Python реализации технологии OMGP можно найти в библиотеке GPClust .
У меня есть еще одна статья, где мы ослабили задачу, чтобы получить задачу выпуклой оптимизации, но она еще не принята к публикации. Он специфичен для 2 кривых, поэтому он отлично подойдет для ваших данных. Дайте знать, если вас это заинтересовало.
источник
У user1149913 отличный ответ (+1), но мне кажется, что ваш сбор данных развалился в конце 2011 года, так что вам пришлось бы отрезать эту часть своих данных, а затем несколько раз запускать вещи с разными случайными числами. Начальные коэффициенты, чтобы увидеть, что вы получите.
Одним из простых способов сделать это было бы разделить ваши данные на два набора на глаз, а затем использовать любой метод линейной модели, к которому вы привыкли. В R это была бы
lm
функция.Или подходят две линии на глаз. В R вы бы использовали
abline
для этого.Данные перемешаны, имеют выбросы и в конце распадаются, но на глаз есть две довольно очевидные линии, поэтому я не уверен, что причудливый метод того стоит.
источник