鱼C论坛

 找回密码
 立即注册
查看: 3695|回复: 0

python多项式拟合

[复制链接]
发表于 2016-12-5 21:22:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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的多项式更加精确,不过在实际使用中,过多的系数意味著过多的因素,因此根据实际或经验选择合适的自由度是比较重要的,其物理意义也容易找到。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-11 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表