Должен ли я использовать numpy.polyfit или numpy.polynomial.polyfit или numpy.polynomial.polynomial.Polynomial? - PullRequest
3 голосов
/ 31 октября 2019

В чем разница между

https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html

и

https://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyfit.html

и какую из них использовать, когда?

Я проверил код и, тем не менее, оба они используют numpy.linalg.linalg.lstsq в своем коде, но отличаются друг от друга.

В документации numpy.polyfit также предлагается использовать

https://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.Polynomial.fit.html

Каков правильный выбор?

(Бонус: как бы я использовал класс, когда первое, что я хочу сделать, это соответствовать моим данным?)

1 Ответ

1 голос
/ 01 ноября 2019

Из того, что я могу сказать, здесь много унаследованного багажа, и мы не должны использовать numpy.polyfit, и нам следует предпочесть numpy.polynomial.polynomial.Polynomial.fit.

Рассмотрим комментарии к этому выпуску github от 2016 года :

Хотя документация достаточно ясна, отмечая, что коэффициенты возвращаются [из numpy.polyfit - ред. ] с наивысшим значением-последний, это довольно легко пропустить и несовместимо с, например, numpy.polynomial.polynomial.polyfit().

И чуть позже

Имея сначала коэффициент нулевой степени,как это сделано в numpy.polynomial.polynomial.polyfit, определенно более логично. У меня сложилось впечатление, что единственная причина, по которой numpy.polyfit отклоняется от этого, - это историческая случайность, которую, конечно, сейчас почти невозможно исправить, поскольку многие программы могут зависеть от этого поведения. Возможно, самым простым решением было бы указать людям на «предпочтительное» решение в numpy.polyfit?

Из предыдущего комментария очевидно, что «историческая случайность» - это поведение MATLAB's polyfit, который первым принимает высокие заказы. В начале numpy сохранял это запутанное соглашение (которое, возможно, даже унаследовало от предшественника проекта), но позже numpy.polynomial.polynomial.polyfit был реализован для Do It Right ™. Принципиальным отличием является то, что (в отличие от MATLAB) Python использует индексы, основанные на 0, и в этом случае совершенно естественно сначала иметь нулевой порядок. С этим соглашением есть прекрасное свойство, что элемент k соответствует термину x**k.

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

History

(необязательно в хронологическом порядке)

  1. У определенного пакета линейной алгебры на основе JVM былаФункция polyfit для подбора многочленов, которые сделали странный выбор дизайна, например, сначала возвращает коэффициенты с наивысшей степенью.
  2. numpy, пытаясь поддержать беглецов из указанной среды, создал функцию numpy.polyfit, котораяПодчеркнув, что выбор дизайна
  3. NumPy реализован numpy.ma.polyfit для замаскированных массивов, с использованием numpy.polyfit
  4. В попытке исправить ошибки истории Numpy создал функцию numpy.polynomial.polynomial.polyfit с почти точнота же подпись, но с более разумным упорядочением коэффициентов, и тихо предпочитали, чтобы люди использовали ее вместо
  5. Люди были смущены этими двумя очень похожими функциями ( # 7478 );Кроме того, новая функция не смогла вернуть ковариационную матрицу, и у нее не было аналога маскированного массива
  6. При включении как нирваны API, так и изношенных клавиатур, numpy представил класс numpy.polynomial.polynomial.Polynomial и задокументирован в numpy.polyfit что это был предпочтительный способ подбора полиномов, хотя он также не имел маскированной реализации и также не возвращал ковариационную матрицу

Ответы разработчиков по двум вопросам дают понять, чтоnumpy.polyfit - это технический долг, и, как говорится в его документации, новый код должен использовать класс Polynomial. Документация значительно улучшилась с 2016 года, теперь есть указатели от numpy.polyfit до Polynomial, но все еще остается много неясностей. В идеале оба метода polyfit должны объяснять свою ситуацию относительно других и указывать пользователям класс Polynomial как единственный очевидный способ написания нового кода.

...