Установка прямой линии на часть набора данных

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

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

Что я хочу сделать, так это:

  • найти точку, после которой набор данных отклоняется от прямой линии, которая может меняться в каждом наборе данных (моя основная проблема)
  • найдите наилучшее соответствие (прямая линия) по точкам данных (синяя линия на рисунке ниже).

Пожалуйста, поделись своими мыслями.

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


person Ali Wali    schedule 22.06.2020    source источник


Ответы (3)


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

Для этого вам нужно будет доверять тому, что первые 3 или около того точки данных лежат вдоль линии (чтобы получить оценку направления базовой линии), а затем проверить, не отклоняется ли направление от ранее добавленной точки данных к следующей более чем на 10% или 20% или около того от среднего направления всех точек, являющихся частью предварительной линии до сих пор.

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

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

person Daniel B.    schedule 22.06.2020
comment
Спасибо за ваш комментарий @Daniel B. Проблема с итеративным поиском заключается в типе данных, с которыми я имею дело, которые могут состоять из тысяч точек данных. Я привел пример здесь просто в качестве иллюстрации. Я попробовал итеративный поиск и не смог найти точку отклонения. - person Ali Wali; 23.06.2020
comment
А как насчет локального поиска? Допустим, вы всегда рассматриваете (работающее) окно из 100 (0) последовательных точек данных или около того и разделяете его на две части. Для каждой стороны вы вычисляете набор векторов направления от каждой точки данных к следующей. В первый раз, когда это сравнение двух наборов векторов по 49 направлений значительно различается (с учетом статистического теста), вы принимаете это как указание на точку перехода от одного распределения к другому. В конце концов, можно предположить, что эти разные «линии» в данных происходят из статистически значимых разных распределений. - person Daniel B.; 23.06.2020
comment
Усреднение по нескольким последовательным векторам направления на раздел вашего рабочего окна и использование теста статистической значимости можно рассматривать как средство фильтрации шума. - person Daniel B.; 23.06.2020
comment
А чтобы упростить работу с векторами в статистических тестах, вы можете преобразовать их в углы поворота относительно некоторой глобальной системы координат, которую вы накладываете на свои данные. Затем вы проверяете два набора углов поворота на их статистическую разницу. - person Daniel B.; 23.06.2020

По сути, вы ищете локоть. Самый простой способ сделать это — уместить набор данных в две строки и итерировать диапазон каждой строки для перехода от одного конца к другому. Затем вы выбираете самый высокий средний R (или самый низкий остаток), и у вас есть наилучшее соответствие для обеих линий тренда. Некоторый код:

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
R = []
x = np.linspace(1,10,10).reshape((-1, 1))
y = np.linspace(1,5,5)
y=np.append(y,np.linspace(6,20,5))
for i in range(1,len(x)-1):
    l1x = x[:i]
    l2x = x[i+1:]
    l1y = y[:i]
    l2y = y[i+1:]
    model1 = LinearRegression().fit(l1x, l1y)
    model2 = LinearRegression().fit(l2x, l2y)
    R.append((model1.score(l1x, l1y)+model2.score(l2x, l2y))/2)
person Nic Thibodeaux    schedule 22.06.2020
comment
Спасибо, Ник. Но не совсем локоть. То, что вы видите здесь, — это просто упрощенная версия моих данных. Точки после точки отклонения могут иметь любую форму и направление и не обязательно могут располагаться на прямой линии. - person Ali Wali; 23.06.2020
comment
Попался, я думаю, вы могли бы изменить это тогда и взять только значение R модели. Вы должны ожидать, как правило, высокого R, пока не начнется отклонение. Чтобы действительно быть в безопасности, вы можете начать диапазон с первых 5 точек (или с чем вам удобно) и увеличивать диапазон оттуда. Точка отклонения должна быть индексом, где R опускается ниже высокого значения. - person Nic Thibodeaux; 23.06.2020

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

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

person Leo Denham    schedule 22.06.2020