numpy基础(part7)--多项式拟合
生活随笔
收集整理的這篇文章主要介紹了
numpy基础(part7)--多项式拟合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習筆記,這個筆記以例子為主。
開發工具:Spyder
多項式擬合
多項式的一般形式:
y=p0xn+p1xn?1+p2xn?2+p3xn?3+...+pny=p_{0}x^n + p_{1}x^{n-1} + p_{2}x^{n-2} + p_{3}x^{n-3} +...+p_{n} y=p0?xn+p1?xn?1+p2?xn?2+p3?xn?3+...+pn?
多項式擬合的目的是為了找到一組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 mdx = 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 mpx = np.linspace(-5, 5, 500) y1 = 3*x - 1 y2 = -5*x + 3P1 = 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 mddef time2time(yt):yt = str(yt, encoding='utf-8')nt = dt.datetime.strptime(yt, '%Y/%m/%d').date()t = nt.strftime('%Y-%m-%d')return tdates, 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 mddef time2time(yt):yt = str(yt, encoding='utf-8')nt = dt.datetime.strptime(yt, '%Y/%m/%d').date()t = nt.strftime('%Y-%m-%d')return tdates, 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+066.05866199e+10]圖像:
總結
以上是生活随笔為你收集整理的numpy基础(part7)--多项式拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows10最常用的几种快捷键
- 下一篇: numpy基础(part8)--符号数组