|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
多项式拟合
多项式拟合可以拟合成形如a1*xn + a2*xn-1 + ... + ai*x + aj = y的公式。
仍然以上述数据为例说明下多项式拟合的用法。这里用到两个类,一个是numpy.polyfit,一个是numpy.poly1d.
numpy.polyfit形式:
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
一般来说,只需要关注前三个参数,x, y分别对应未知数数组和函数值数组,deg是自由度,即x的阶数,比如deg为3,则公式最后的结果x的指数最大到3。numpy.polyfit返回的结果是一个包含系数的数组,
这个数组可以被numpy.poly1d,使用,示例如下:
构建一个x2 + 2*x + 3的多项式:
p = np.poly1d([1, 2, 3])
print np.poly1d(p)
输出:
2
1 x + 2 x + 3
输入一个未知数的值,可得结果:
p(0.5)
输出:
4.25
下面依然用#最小二乘拟合中的数据来说明怎么进行多项式拟合,这里我们自由度选选择两个,一个是6,一个是3,看看两个分别拟合的结果如何。
源代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''多項式擬合'''
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
# 第1個擬合,自由度為3
z1 = np.polyfit(x, y, 3)
# 生成的多項式對象
p1 = np.poly1d(z1)
print(z1)
print(p1)
# 第2個擬合,自由度為6
z2 = np.polyfit(x, y, 6)
# 生成的多項式對象
p2 = np.poly1d(z2)
print(z2)
print(p2)
# 繪制原曲線及擬合後的曲線
# 原曲線
pl.plot(x, y, 'b^-', label='Origin Line')
# 自由度為3的曲線
pl.plot(x, p1(x), 'gv--', label='Poly Fitting Line(deg=3)')
pl.plot(x, p2(x), 'r*', label='Poly Fitting Line(deg=6)')
pl.axis([0, 18, 0, 18])
pl.legend()
# Save figure
pl.savefig('scipy02.png', dpi=96)
输出结果:
[ 0.00624491 -0.20371114 2.18193147 2.57208791]
3 2
0.006245 x - 0.2037 x + 2.182 x + 2.572
[ -1.89843481e-06 1.90557772e-04 -6.80682074e-03 1.16832830e-01
-1.04793542e+00 4.90253564e+00 1.76057692e-02]
6 5 4 3 2
-1.898e-06 x + 0.0001906 x - 0.006807 x + 0.1168 x - 1.048 x + 4.903 x + 0.01761
图像:
protected.png
结果很明显,自由度为6的多项式比自由度为3的多项式更加精确,不过在实际使用中,过多的系数意味著过多的因素,因此根据实际或经验选择合适的自由度是比较重要的,其物理意义也容易找到。 |
|