为什么numpy.polyfit和numpy.polynomial.polynomial.polyfit
在下面的测试产生不同的情节?
import numpy as np
from numpy.polynomial.polynomial import polyfit
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 50)
y = 5 * x + 10 + (np.random.random(len(x)) - 0.5) * 5
plt.scatter(x, y,marker='.', label='Data for regression')
plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)),
label='numpy.polyfit')
plt.plot(np.unique(x), np.poly1d(polyfit(x, y, 1))(np.unique(x)),
label='polynomial.polyfit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
Wil*_*ler 12
乍一看,文档似乎表明它们应该给出相同的结果 -
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
最小二乘多项式拟合。
适合的多项式p(x) = p[0] * x**deg + ... + p[deg]度的度来分(X,Y) 。返回系数p的向量,该向量以deg, deg-1, ... 0的顺序最小化平方误差。
和
numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=None)
多项式对数据的最小二乘拟合。
返回度数为 deg 的多项式的系数,该多项式是对点 x 处给出的数据值 y 的最小二乘拟合。如果 y 是 1-D,则返回的系数也将是 1-D。如果 y 是二维的,则进行多次拟合,y 的每一列都进行一次拟合,所得系数存储在二维返回的相应列中。拟合多项式的形式为
p(x) = c 0 + c 1 * x + ... + c n * x n
但区别在于从两种方法返回的系数的顺序,至少对于所讨论的用例是这样。
numpy.polyfit根据生成方程
p(x) = c n * x n + c (n-1) * x (n-1) + ... + c 1 * x + c 0,按度数降序返回系数numpy.polynomial.polynomial.polyfit根据生成方程
p(x) = c 0 + c 1 * x + ... + c (n-1) * x (n-1) + c n * x n,以度的升序返回系数尽管在数学上相同,但这两个方程在ndarray表示上并不相同。在文档中使用不同的符号可能会混淆这一点。为了演示,请考虑以下内容
import numpy as np
x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10
print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
Run Code Online (Sandbox Code Playgroud)
[ 1. 5. 10.]
[10. 5. 1.]
Run Code Online (Sandbox Code Playgroud)
两种方法都得到相同的结果,但顺序相反,前者是np.poly1d()预期的,
print(np.poly1d(np.polyfit(x, y, 2)))
print(np.poly1d(np.polynomial.polynomial.polyfit(x, y, 2)))
Run Code Online (Sandbox Code Playgroud)
2
1 x + 5 x + 10
2
10 x + 5 x + 1
Run Code Online (Sandbox Code Playgroud)
后者是np.polynomial.polynomial.Polynomial()构造函数所期望的。,
print(np.polynomial.polynomial.Polynomial(np.polynomial.polynomial.polyfit(x, y, 2)))
print(np.polynomial.polynomial.Polynomial(np.polyfit(x, y, 2)))
Run Code Online (Sandbox Code Playgroud)
poly([10. 5. 1.]) # 10 + 5 * x + 1 * x**2
poly([ 1. 5. 10.]) # 1 + 5 * x + 10 * x**2
Run Code Online (Sandbox Code Playgroud)
在将结果np.polynomial.polynomial.polyfit传递给poly1d()或使用 a之前翻转结果np.polynomial.polynomial.Polynomial将产生预期的结果:
| 归档时间: |
|
| 查看次数: |
3903 次 |
| 最近记录: |