使用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()
,正如文档似乎暗示的那样?
Polynomial.fit()
文档,它返回:
表示数据的最小二乘拟合的系列,并具有在调用中指定的域和窗口。如果对未缩放和未平移的基多项式的系数感兴趣,请执行
。new_series.convert().coef
系数在由窗口和域之间的线性映射定义的缩放域中给出。 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
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]