numpy基础(part7)--多项式拟合

学习笔记,这个笔记以例子为主。
开发工具:Spyder


多项式拟合

多项式的一般形式:
y=p0xn+p1xn1+p2xn2+p3xn3+...+pn y=p_{0}x^n + p_{1}x^{n-1} + p_{2}x^{n-2} + p_{3}x^{n-3} +...+p_{n}

多项式拟合的目的是为了找到一组p0-pn,使得拟合方程尽可能的与实际样本数据相符合。

相关函数:

根据多项式函数(P数组即可以理解为一个多项式函数)与自变量求出拟合值, 由此可得拟合曲线座标样本数据 [X, Y']
np.polyval(P, X)->Y'

多项式函数求导,根据拟合系数求出多项式函数导函数的系数
np.polyder(P)->Q 

已知多项式系数Q 求多项式函数的根(与x轴交点的横座标)
xs = np.roots(Q)

两个多项式函数的差函数的系数(可以通过差函数的根求取两个曲线的交点)
Q = np.polysub(P1, P2)

多项式拟合(可以得到拟合的多项式系数)
P = np.polyfit(x, y, k)
#k为要拟合的多项式的最高阶数
  • 案例

求多项式y = 4x3 + 3x2 - 500*x + 10曲线驻点的座标。
驻点又称为平稳点、稳定点或临界点,是函数的一阶导数为零的点,即在“这一点”,函数的输出值停止增加或减少。

代码:

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as mp
import matplotlib.dates as md

x = np.linspace(-20, 20, 1000)
y = 4*x**3 + 3*x**2 -500*x + 10


# 提取多项式系数
P = np.array([4, 3, -500, 10])
Q = np.polyder(P)
xs = np.roots(Q)

#把xs带入原函数中求出驻点Y值
ys = np.polyval(P, xs)

print('Q', Q)
print('xs:', xs, 'ys:', ys)

mp.plot(x, y)
mp.scatter(xs, ys, s = 60, color = 'r')
mp.show()

结果:

Q [  12    6 -500]
xs: [-6.70981166  6.20981166] ys: [ 2291.62545875 -2021.37545875]

图像:

  • 案例2

求出y1 = 3x - 1与y2 = -5x + 3的交点。

代码:

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as mp


x = np.linspace(-5, 5, 500)
y1 = 3*x - 1
y2 = -5*x + 3

P1 = np.array([3, -1])
P2 = np.array([-5, 3])

P_diff = np.polysub(P1, P2)
xs = np.roots(P_diff)
ys = np.polyval(P1, xs)

print('xs:', xs, 'ys:', ys)

mp.plot(x, y1, 
        color = 'dodgerblue', linestyle = '--', 
        label = "y1")
mp.plot(x, y2, 
        color = 'r', linestyle = ':', 
        label = "y2")

mp.scatter(xs, ys, s = 60, color = 'y')
mp.legend(loc = 0)

mp.show()

结果:

xs: [ 0.5] ys: [ 0.5]

图像:

  • 案例3

按照PM25数据,拟合出多项式曲线,并绘制多项式函数曲线图。

首先绘制PM25的时序图:

import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md


def time2time(yt):
	yt = str(yt, encoding='utf-8')
	nt = dt.datetime.strptime(yt, '%Y/%m/%d').date()
	t = nt.strftime('%Y-%m-%d')
	return t


dates, AQI, PM25 = np.loadtxt(
        r'C:\Users\goatbishop\Desktop\data\data01.csv',
        delimiter = ',',
        usecols = tuple(range(3)),
        unpack = True,
        skiprows=1,
        dtype = 'M8[D], f8, f8',
        converters = {0:time2time})

dates = dates.astype(md.datetime.datetime)
mp.subplot(2, 1, 1)
mp.plot(dates, PM25, color = 'dodgerblue', linestyle = '--')

ax = mp.gca()
ax.xaxis.set_major_locator(
    md.WeekdayLocator(byweekday=md.SU))
ax.xaxis.set_major_formatter(
    md.DateFormatter('%d %b %Y'))
ax.xaxis.set_minor_locator(md.DayLocator())

mp.show()

图像:

我们再拟合PM25数据,得到拟合的多项式系数,并绘制拟合的图像:

import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md


def time2time(yt):
	yt = str(yt, encoding='utf-8')
	nt = dt.datetime.strptime(yt, '%Y/%m/%d').date()
	t = nt.strftime('%Y-%m-%d')
	return t


dates, AQI, PM25 = np.loadtxt(
        r'C:\Users\goatbishop\Desktop\data\data01.csv',
        delimiter = ',',
        usecols = tuple(range(3)),
        unpack = True,
        skiprows=1,
        dtype = 'M8[D], f8, f8',
        converters = {0:time2time})

#dates = dates.astype(md.datetime.datetime)
dates = dates.astype('M8[D]').astype('i4')
P_PM25 = np.polyfit(dates, PM25, 4)
ys = np.polyval(P_PM25, dates)

mp.subplot(2, 1, 1)
mp.plot(dates, PM25, color = 'dodgerblue', linestyle = '--')
mp.subplot(2, 1, 2)
mp.plot(dates, ys, color = 'r',linestyle = '--')

mp.show()

拟合的多项式系数:

[ -6.57837904e-07   2.29193687e-02   1.98500077e-02  -6.95589722e+06
   6.05866199e+10]

图像:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章