學習筆記,這個筆記以例子爲主。
開發工具: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]
圖像: