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]

圖像:

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