Когда и как использовать Polynomy.fit() в отличие от polyfit()?

#python #numpy #polynomials #coefficients

#python #numpy #многочлены #коэффициенты

Вопрос:

Использование Python 3.10.0 и NumPy 1.21.4.

Я пытаюсь понять, почему Polynomial.fit() вычисляются совершенно разные значения коэффициентов polyfit() .

В следующем коде:

 import numpy as np

def main():
    x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
    y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])

    c1 = np.polynomial.polynomial.polyfit(x, y, 2)
    c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2).coef

    print(c1)
    print(c2)

if __name__ == '__main__':

    main()
 

c1 содержит:

 [-3.33620814e 03  3.44704650e 00 -2.18221029e-04]
 

который создает строку наилучшего соответствия при подключении a bx cx^2 , которую я предсказал, пока c2 содержит:

 [8443.4986422  2529.67242075 -872.88411679]
 

что приводит к совершенно другой строке при подключении к той же формуле.

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

Если я неправильно использую функции, каков правильный способ их использования?

Если я правильно использую обе функции, зачем мне использовать Polynomial.fit() over polyfit() , поскольку документация, похоже, подразумевает, что я должен?

Ответ №1:

Согласно Polynomial.fit() документации, он возвращает:

Ряд, представляющий наименьшие квадраты, соответствующие данным, и имеющий домен и окно, указанные в вызове. Если представляют интерес коэффициенты для немасштабированных и несмещенных базисных многочленов, сделайте new_series.convert().coef это.

Вы можете найти в https://numpy.org/doc/stable/reference/routines .многочлены.html#переход-от-numpy-poly1d-к-numpy-многочлену, который

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

Вы можете проверить

 import numpy as np

def main():
    x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
    y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])

    c1 = np.polynomial.polynomial.polyfit(x, y, 2)
    c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2).convert().coef
    c3 = np.polynomial.polynomial.Polynomial.fit(x, y, 2, window=(x.min(), x.max())).coef

    print(c1)
    print(c2)
    print(c3)

if __name__ == '__main__':

    main()

# [-3.33620814e 03  3.44704650e 00 -2.18221029e-04]
# [-3.33620814e 03  3.44704650e 00 -2.18221029e-04]
# [-3.33620814e 03  3.44704650e 00 -2.18221029e-04]
 

Вероятно, самой важной причиной для использования Polynomial.fit() является его поддержка в текущей версии NumPy и рассмотрение polyfit как устаревшей

Ответ №2:

 import numpy as np

def main():
    x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
    y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])

    c1 = np.polynomial.polynomial.polyfit(x, y, 2)
    c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2, domain=[]).coef

    print(c1)
    print(c2)
main()
 

Вы также можете получить коэффициенты, передав пустой список domain ключевому слову, которое заставляет класс использовать свой домен по умолчанию [-1,1] и выдает эти выходные данные

 [-3.33620814e 03  3.44704650e 00 -2.18221029e-04]
[-3.33620814e 03  3.44704650e 00 -2.18221029e-04]