学习笔记,这个笔记以例子为主。
开发工具:Spyder
多项式拟合
多项式的一般形式:
多项式拟合的目的是为了找到一组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]
图像: