Python - попытка выполнить более надежную линейную подгонку

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

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

Теперь с подгонкой все в порядке, но общий консенсус заключается в том, что линия наилучшего подгонки искажается этими красными точками данных над ней, и я на самом деле должен подгонять данные чуть ниже нее, которые образуют красивую линейную форму (начиная с этого перегруженного сгусток синих точек). Поэтому я попытался добавить взвешивание к моему вызову polyfit и выбрал произвольное взвешивание 1/sqrt(значения y), поэтому в основном меньшие значения y будут иметь более благоприятный вес. Это дало следующее:

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

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


person Joshua D'Agostino    schedule 07.03.2016    source источник
comment
Да, в Python есть много расширенных пакетов для статистики. Но это больше статистика, чем вопрос программирования. Найдите Classification for outlier removal, clustering, k-nearest neighbor, RANSAC, robust regression. В конце концов, понимание вашего эксперимента и, возможно, поиск причин для исключения определенных данных, как правило, является лучшим подходом первого порядка.   -  person roadrunner66    schedule 07.03.2016
comment
Большое спасибо @roadrunner66!   -  person Joshua D'Agostino    schedule 07.03.2016


Ответы (2)


Этот вопрос на самом деле не имеет ничего общего с программированием или python, а больше связан со статистикой или линейной алгеброй.

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

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

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

person russloewe    schedule 07.03.2016

statsmodels имеет надежные линейные оценщики, RLM, с различными весовыми функциями, которые должны хорошо работать в подобных случаях.

http://www.statsmodels.org/dev/generated/statsmodels.robust.robust_linear_model.RLM.html http://www.statsmodels.org/dev/examples/index.html#robust

Это M-оценки, которые устойчивы к «y выбросам», но не к «x выбросам», которые являются влиятельными регрессорами выбросов.

person Josef    schedule 07.03.2016