何时以及如何使用 Polynomial.fit() 而不是 polyfit()?

问题描述 投票:0回答:2

使用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()
而不是
polyfit()
,正如文档似乎暗示的那样?

python numpy polynomials coefficients
2个回答
6
投票

根据

Polynomial.fit()
文档,它返回:

表示数据的最小二乘拟合的系列,并具有在调用中指定的域和窗口。如果对未缩放和未平移的基多项式的系数感兴趣,请执行

new_series.convert().coef

您可以在 https://numpy.org/doc/stable/reference/routines.polynomials.html#transitioning-from-numpy-poly1d-to-numpy-polynomial那个

系数在由窗口和域之间的线性映射定义的缩放域中给出。 Convert 可用于获取未缩放数据域中的系数。

你可以检查一下

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]

使用

np.polynomial.Polynomial
类的另一个论点在文档中进行了说明 https://numpy.org/doc/stable/reference/routines.polynomials.package.html


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]
© www.soinside.com 2019 - 2024. All rights reserved.