我使用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()
合身看起来不错:
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
我忍不住觉得这是错的,他们倒退是没有意义的
我在周围挖了很多,发现了发生的事情。事实证明,numpy有两套多项式工具,一套在基本numpy库中,另一套在
numpy.polynomial
中,它们的预期顺序相反。在这两个库中都可以找到polyfit
和polyval
,并且在这个简单的情况下似乎操作相同,但它们的参数不同:从
numpy
:polyfit
和polyval
都期望并返回从高次到低次的多项式系数从
numpy.polynomial
polyfit
和polyval
都期望并返回从低到高次排序的多项式系数。还请注意polyval
需要不同顺序的参数下面是一个快速演示:
这两者在名义上似乎是等同的,但你不能在没有意识到细微差别的情况下混搭
如果有人知道为什么有两种不同的实现,我很想知道
相关问题 更多 >
编程相关推荐