何时以及如何使用Polynomial.fit()替代polyfit()?

4
使用 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()

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]

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接