原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.polyfit.html
校对:(虚位以待)
numpy.ma.
polyfit
(x, y, deg, rcond=None, full=False, w=None, cov=False)[source]最小二乘多项式拟合。
拟合多项式p(x) = p [0] * x **度 + ... + p [deg] > deg到点(x,y)。
返回使平方误差最小的系数p的向量。
参数: | x:array_like,shape(M,)
y:array_like,shape(M,)或(M,K)
deg:int
rcond:float,可选
full:bool,可选
w:array_like,shape(M,),可选
cov:bool,可选
|
---|---|
返回: | p:ndarray,shape(M,)或(M,K)
残差,秩,奇异值,rcond:
V : ndarray, shape (M,M) or (M,M,K)
|
警告: | RankWarning
|
也可以看看
polyval
linalg.lstsq
scipy.interpolate.UnivariateSpline
笔记
x中的任何掩码值都在y中传播,反之亦然。
参考文献
[R52] | 维基百科,“曲线拟合”,http://en.wikipedia.org/wiki/Curve_fitting |
[R53] | 维基百科,“多项式插值”,http://en.wikipedia.org/wiki/Polynomial_interpolation |
例子
>>> x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
>>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
>>> z = np.polyfit(x, y, 3)
>>> z
array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254])
使用poly1d对象来处理多项式很方便:
>>> p = np.poly1d(z)
>>> p(0.5)
0.6143849206349179
>>> p(3.5)
-0.34732142857143039
>>> p(10)
22.579365079365115
高阶多项式可能会剧烈振荡:
>>> p30 = np.poly1d(np.polyfit(x, y, 30))
/... RankWarning: Polyfit may be poorly conditioned...
>>> p30(4)
-0.80000000000000204
>>> p30(5)
-0.99999999999999445
>>> p30(4.5)
-0.10547061179440398
插图:
>>> import matplotlib.pyplot as plt
>>> xp = np.linspace(-2, 6, 100)
>>> _ = plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--')
>>> plt.ylim(-2,2)
(-2, 2)
>>> plt.show()