为什么numpy的polyfit和polyval期望多项式系数的顺序相反?

2024-10-04 05:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用numpy的polyfit来拟合一些噪声数据,然后想使用polyval来评估一些新点的拟合。出于某种原因,拟合工作正常,但polyval仅在我颠倒多项式系数的顺序时才能给出正确的结果:

import numpy as np
import numpy.polynomial.polynomial as poly
import matplotlib.pyplot as plt

# a noisy line
x = np.linspace(0, 10, 100)
y = x + np.random.normal(0, 1, x.shape)

# calculate fit polynomial
fit_coeffs_poly = poly.polyfit(x, y, deg=1)
fit_polynomial_poly = poly.Polynomial(fit_coeffs_poly)(x)

# plot to check fit 
plt.plot(x, y, label='noisy')
plt.plot(x, fit_polynomial_poly, '-r', label='polyfit')
plt.legend(loc='lower right')
plt.show()

合身看起来不错:

enter image description here

polyval仅在系数反转时有效:

>>> for i in range(0, 10):
>>>    print(np.polyval(fit_coeffs_poly, i))

0.9792056688016727
1.139755470535941
1.3003052722702093
1.4608550740044774
1.6214048757387456
1.781954677473014
1.9425044792072823
2.1030542809415502
2.2636040826758186
2.424153884410087

>>> for i in range(0, 10):
>>>    print(np.polyval(fit_coeffs_poly[::-1], i))

0.16054980173426825
1.139755470535941
2.1189611393376135
3.0981668081392866
4.077372476940959
5.056578145742631
6.035783814544304
7.0149894833459765
7.9941951521476495
8.973400820949323

我忍不住觉得这是错的,他们倒退是没有意义的


Tags: importnumpyplotasnppltlabelfit
1条回答
网友
1楼 · 发布于 2024-10-04 05:30:01

我在周围挖了很多,发现了发生的事情。事实证明,numpy有两套多项式工具,一套在基本numpy库中,另一套在numpy.polynomial中,它们的预期顺序相反。在这两个库中都可以找到polyfitpolyval,并且在这个简单的情况下似乎操作相同,但它们的参数不同:

numpy

def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
def polyval(p, x)

polyfitpolyval都期望并返回从高次到低次的多项式系数

numpy.polynomial

def polyfit(x, y, deg, rcond=None, full=False, w=None)
def polyval(x, c, tensor=True) 

polyfitpolyval都期望并返回从低到高次排序的多项式系数。还请注意polyval需要不同顺序的参数

下面是一个快速演示:

import numpy as np
import numpy.polynomial.polynomial as poly
import matplotlib.pyplot as plt

# a noisy line
x = np.linspace(0, 10, 100)
y = x + np.random.normal(0, 1, x.shape)

# calculate fit polynomial with base numpy
fit_coeffs_np = np.polyfit(x, y, deg=1)
fit_polynomial_np = poly.Polynomial(fit_coeffs_np[::-1])(x)
print("numpy", fit_coeffs_np)

# calculate fit polynomial with numpy.polynomial.polynomial
fit_coeffs_poly = poly.polyfit(x, y, deg=1)
fit_polynomial_poly = poly.Polynomial(fit_coeffs_poly)(x)
print("poly", fit_coeffs_poly)

# test some values
for i in range(0, 10):
    print(np.polyval(fit_coeffs_np, i), poly.polyval(i, fit_coeffs_poly))

# make a nice plot
plt.xlabel('X')
plt.ylabel('Y')
plt.plot(x, y, label='noisy')
plt.plot(x, fit_polynomial_poly, '-g', label='np.poly')
plt.plot(x, fit_polynomial_np, '-r', label='np')
plt.legend(loc='lower right')
plt.text(0, 10, 'np: {}'.format(fit_coeffs_np))
plt.text(0, 9, 'np.poly: {}'.format(fit_coeffs_poly))
plt.savefig('good.png')
plt.show() 

enter image description here

-0.009244843991578149 -0.009244843991576678
1.0080792020754397 1.0080792020754408
2.0254032481424575 2.025403248142458
3.042727294209475 3.0427272942094756
4.060051340276494 4.060051340276493
5.077375386343512 5.07737538634351
6.094699432410529 6.094699432410528
7.112023478477547 7.112023478477545
8.129347524544565 8.129347524544563
9.146671570611582 9.14667157061158

这两者在名义上似乎是等同的,但你不能在没有意识到细微差别的情况下混搭

如果有人知道为什么有两种不同的实现,我很想知道

相关问题 更多 >