python擬合函數
Ⅰ 多項式擬合平方誤差怎麼求
線性模型(二)之多項式擬合
1. 多項式擬合問題
多項式擬合(polynominal curve fitting)是一種線性模型,模型和擬合參數的關系是線性的。多項式擬合的輸入是一維的,即x=xx=x,這是多項式擬合和線性回歸問題的主要區別之一。
多項式擬合的目標是構造輸入xx的MM階多項式函數,使得該多項式能夠近似表示輸入xx和輸出yy的關系,雖然實際上xx和yy的關系並不一定是多項式,但使用足夠多的階數,總是可以逼近表示輸入xx和輸出yy的關系的。
多項式擬合問題的輸入可以表示如下:
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
目標輸出是得到一個多項式函數:
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
其中MM表示最高階數為MM。
可見衡慎在線性擬合的模型中,共包括了(M+1)(M+1)個參數,而該模型雖然不是輸入xx的線性函數,但卻是(M+1)(M+1)個擬合參數的線性函數,所以稱多項式擬合為線性模型。對於多項式擬合問題,其實就是要確定這(M+1)(M+1)個參數,這里先假設階數MM是固定的(MM是一個超參數,可以用驗證集來確定MM最優的值,詳細的關於MM值確定的問題,後面再討論),重點就在於如何求出這(M+1)(M+1)個參數的值。
2.優化目標
多告大項式擬合是利用多項式函數逼近輸入xx和輸出yy的函數關系,通過什麼指標來衡量某個多項式函數的逼近程度呢?(其實這就是誤差/損失函數)。擬合/回歸問題常用的評價指標是均方誤差(在機器學習中的模型評估與度量博客中,我進行了介紹)。多項式擬合問題也同樣採用該評價指標,以均方誤差作為誤差/損失函數,誤差函數越小,模型越好。
E(w,b)=1N∑i=1N[f(xi)−yi]2
E(w,b)=1N∑i=1N[f(xi)−yi]2
系數1N1N是一常數,對優化結果無影響,可以去除,即將均方誤差替換為平方誤差:
E(w,b)=∑i=1N[f(xi)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2
到這里,就成功把多項式擬合問題變成了最優化問題,優化咐友敬問題可表示為:
argminw,bE(w,b)
argminw,bE(w,b)
即需要求得參數{w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那麼如何對該最優化問題求解呢?
3. 優化問題求解
3.1 求偏導,聯立方程求解
直觀的想法是,直接對所有參數求偏導,令偏導為0,再聯立這M+1M+1個方程求解(因為共有M+1M+1個參數,故求偏導後也是得到M+1M+1個方程)。
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]2
利用E(w,b)E(w,b)對各個參數求偏導,如下:
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]xji=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]
∂E(w,b)∂wj=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]xij∂E(w,b)∂b=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]
求導之後,將各個點(xi,yi)(xi,yi)的值帶入偏導公式,聯立方程求解即可。
針對該解法,可以舉個例子詳細說明,比如有兩個點(2,3),(5,8)(2,3),(5,8),需要利用二階多項式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b擬合。求解過程如下:
該二階多項式對參數求偏導得到
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=12[(w1x1i+w2x2i+b)−yi]xji=[(w1x1+w2x21+b)−y1]xj1+[(w1x2+w2x22+b)−y2]xj2=2∑i=12[(w1x1i+w2x2i+b)−yi]=[(w1x1+w2x21+b)−y1]+[(w1x2+w2x22+b)−y2]
∂E(w,b)∂wj=2∑i=12[(w1xi1+w2xi2+b)−yi]xij=[(w1x1+w2x12+b)−y1]x1j+[(w1x2+w2x22+b)−y2]x2j∂E(w,b)∂b=2∑i=12[(w1xi1+w2xi2+b)−yi]=[(w1x1+w2x12+b)−y1]+[(w1x2+w2x22+b)−y2]
將點(2,3),(5,8)(2,3),(5,8)帶入方程,可以得到3個方程,
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
聯立這三個方程求解,發現有無窮多的解,只能得到3w1+21w2=53w1+21w2=5,這三個方程是線性相關的,故沒有唯一解。
該方法通過求偏導,再聯立方程求解,比較復雜,看著也很不美觀。那麼有沒有更加方便的方法呢?
3.2 最小二乘法
其實求解該最優化問題(平方和的最小值)一般會採用最小二乘法(其實最小二乘法和求偏導再聯立方程求解的方法無本質區別,求偏導也是最小二乘法,只是這里介紹最小二乘的矩陣形式而已)。最小二乘法(least squares),從英文名非常容易想到,該方法就是求解平方和的最小值的方法。
可以將誤差函數以矩陣的表示(NN個點,最高MM階)為:
∥Xw−y∥2
‖Xw−y‖2
其中,把偏置bb融合到了參數ww中,
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX則表示輸入矩陣,
⎡⎣⎢⎢⎢⎢11...1x1x2...xNx21x22...x2N............xM1xM2...xMN⎤⎦⎥⎥⎥⎥
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy則表示標注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最優化問題可以重新表示為
minw∥Xw−y∥2
minw‖Xw−y‖2
對其求導,
∂∥Xw−y∥2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
∂‖Xw−y‖2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
在繼續對其求導之前,需要先補充一些矩陣求導的先驗知識(常見的一些矩陣求導公式可以參見轉載的博客https://blog.csdn.net/lipengcn/article/details/52815429),如下:
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
根據上面的矩陣求導規則,繼續進行損失函數的求導
∂∥Xw−y∥2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
∂‖Xw−y‖2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求導結果等於0,即可以求導問題的最小值。
2XTXw−2XTy=0w=(XTX)−1XTy
2XTXw−2XTy=0w=(XTX)−1XTy
再利用最小二乘法的矩陣形式對前面的例子進行求解,用二階多項式擬合即兩個點(2,3),(5,8)(2,3),(5,8)。
表示輸入矩陣 XX和標簽向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
計算XTXXTX
XTX=⎡⎣⎢272972913329133641⎤⎦⎥
XTX=[272972913329133641]
矩陣求逆,再做矩陣乘法運算
但 XTXXTX不可逆,故無唯一解。
關於矩陣的逆是否存在,可以通過判斷矩陣的行列式是否為0(det(A)=?0det(A)=?0 來判斷,也可以通過初等行變換,觀察矩陣的行向量是否線性相關,在這個例子下,矩陣不可逆,故有無窮多解。但如果新增一個點(4,7)(4,7),則就可以解了。
其實這和數據集的點數和選擇的階數有關,如果點數小於階數則會出現無窮解的情況,如果點數等於階數,那麼剛好有解可以完全擬合所有數據點,如果點數大於階數,則會求的近似解。
那麼對於點數小於階數的情況,如何求解?在python的多項式擬合函數中是可以擬合的,而且效果不錯,具體演算法不是很了解,可以想辦法參考python的ployfit()函數的實現。
4. 擬合階數的選擇
在前面的推導中,多項式的階數被固定了,那麼實際場景下應該如何選擇合適的階數MM呢?
一般會選擇階數MM小於點數NN
把訓練數據分為訓練集合驗證集,在訓練集上,同時用不同的MM值訓練多個模型,然後選擇在驗證集誤差最小的階數<script type="math/tex" id="MathJax-Element-5573">M</script
Ⅱ python_numpy最小二乘法的曲線擬合
在了解了最小二乘法的基本原理之後 python_numpy實用的最小二乘法理解 ,就可以用最小二乘法做曲線擬合了
從結果中可以看出,直線擬合並不能對擬合數據達到很好的效果,下面我們介紹一下曲線擬合。
b=[y1]
[y2]
......
[y100]
解得擬合函數的系數[a,b,c.....d]
CODE:
根據結果可以看到擬合的效果不錯。
我們可以通過改變
來調整擬合效果。
如果此處我們把擬合函數改為最高次為x^20的多項式
所得結果如下:
矯正 過擬合 現象
在保持擬合函數改為最高次為x^20的多項式的條件下,增大樣本數:
通過結果可以看出,過擬合現象得到了改善。
Ⅲ python中用polyfit擬合出的函數怎麼能直接調用
首先分兩種情況:
1.交互窗口處執行:這個時候由於python的強制縮進,因此想要結束函數的定義只需要按兩下enter即可。
2.在.py文件中編寫,結束函數只需要不再縮進即可
調用函數方法相同,把函數名及參數寫上就可以了,如果有返回值可以
r=functionA(var1)
附:測試代碼(python3運行通過)
# -*- coding:utf-8 -*-
#author:zfxcx
def pt():
print("hello")
pt()
Ⅳ python擬合指數函數初始值如何設定
求擬合函數,首先要有因變數和自變數的一組測試或實驗數據,根據已知的曲線y=f(x),擬合出Ex和En系數。當用擬合出的函數與實驗數據吻合程度愈高,說明擬合得到的Ex和En系數是合理的。吻合程度用相關系數來衡量,即R^2。首先,我們需要打開Python的shell工具,在shell當中新建一個對象member,對member進行賦值。 2、這里我們所創建的列表當中的元素均屬於字元串類型,同時我們也可以在列表當中創建數字以及混合類型的元素。 3、先來使用append函數對已經創建的列表添加元素,具體如下圖所示,會自動在列表的最後的位置添加一個元素。 4、再來使用extend對來添加列表元素,如果是添加多個元素,需要使用列表的形式。 5、使用insert函數添加列表元素,insert中有兩個參數,第一個參數即為插入的位置,第二個參數即為插入的元素。origin擬合中參數值是程序擬合的結果,自定義函數可以設置參數的初值,也可以不設定參數的初值。
一般而言,擬合結果不會因為初值的不同而有太大的偏差,如果偏差很大,說明數據和函數不太匹配,需要對函數進行改正。X0的迭代初始值選擇與求解方程,有著密切的關系。不同的初始值得出的系數是完全不一樣的。這要通過多次選擇和比較,才能得到較為合理的初值。一般的方法,可以通過隨機數並根據方程的特性來初選。
Ⅳ Python 中的函數擬合
很多業務場景中,我們希望通過一個特定的函數來擬合業務數據,以此來預測未來數據的變化趨勢。(比如用戶的留存變化、付費變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項式擬合 和 自定義函數擬合。
通過多項式擬合,我們只需要指定想要擬合的多項式的最高項次是多少即可。
運行結果:
對於自定義函數擬合,不僅可以用於直線、二次曲線、三次曲線的擬合,它可以適用於任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運行結果:
Ⅵ python polyfit函數怎麼使用
用polyfit(X,Y,1)得到的擬合函數只能得到缺陸a,b,但段雹不能得到線伏燃頃性相關系數R^2。如想要得到其線性相關系數,可以用regress(y,X),其使用格式
[b,bint,r,rint,stats]
=
regress(y,X);
b——擬合系數
bint——b的置信區間
r——殘差值
rint——r的置信區間
stats——檢驗統計量,第一個就是相關系數
例如:
x=[。。。];y=[。。。]
X=[x
ones(n,1)];
%x的行數(列數)
[b,bint,r,rint,stats]
=
regress(y,X);
Ⅶ python擬合圓如何設置擬合精度
OpenCV曲線擬合與圓擬合
使用OpenCV做圖像處理與分析的時候,經常會遇到需要進行曲線擬合與圓擬合的場景,很多OpenCV開發者對此卻是一籌莫展,其實OpenCV中是有現成的函數來實現圓擬合與直線擬合的,而且還會告訴你擬合的圓的半徑是多少,簡直是超級方便,另外一個常用到的場景就是曲線擬合,常見的是基如檔漏於多項式擬合,可以根據設定的多項式冪次生成多項式方程,然後根據方程進行一系列的點生成,形成完整的曲線,這個車道線檢測,輪廓曲線擬合等場景下特別有用。下面就通過兩個簡單的例子來分別學習一下曲線擬合與圓擬合的應用。
一:曲線擬合與應用
基於Numpy包的polyfit函數實現,其支持的三個參數分別是x點集合、y點集合,以及多項式的冪次。得到多項式方程以後,就可以完整擬合曲線,圖中有如下四個點:
渣爛
調用polyfit生成的二階多項式如下:
擬合結果如下:
使用三階多項式擬合,調用polyfit生成的多項式方程如下:
生成的擬合曲線如下:
使用polyfit進行曲線擬合時候需要注意的是,多項式的冪次最大是數據點數目N - 1冪次多項式,比如有4個點,最多生成3階多項式擬合。上述演蠢陸示的完整代碼實現如下:
def circle_fitness_demo():
image = np.zeros((400, 400, 3), dtype=np.uint8)
x = np.array([30, 50, 100, 120])
y = np.array([100, 150, 240, 200])
for i in range(len(x)):
cv.circle(image, (x[i], y[i]), 3, (255, 0, 0), -1, 8, 0)
cv.imwrite("D:/curve.png", image)
poly = np.poly1d(np.polyfit(x, y, 3))
print(poly)
for t in range(30, 250, 1):
y_ = np.int(poly(t))
cv.circle(image, (t, y_), 1, (0, 0, 255), 1, 8, 0)
cv.imshow("fit curve", image)
cv.imwrite("D:/fitcurve.png", image)
二:圓擬合與應用
圓的擬合是基於輪廓發現的結果,對發現的近似圓的輪廓,通過圓擬合可以得到比較好的顯示效果,輪廓發現與擬合的API分別為findContours與fitEllipse,
有圖像如下:
使用輪廓發現與圓擬合處理結果如下:
紅色表示擬合的圓,藍色是圓的中心位置
上述完整的演示代碼如下:
def circle_fitness_demo():
src = cv.imread("D:/javaopencv/c2.png")
cv.imshow("input", src)
src = cv.GaussianBlur(src, (3, 3), 0)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
image, contours, hierachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
rrt = cv.fitEllipse(contours[i])
cv.ellipse(src, rrt, (0, 0, 255), 2, cv.LINE_AA)
x, y = rrt[0]
cv.circle(src, (np.int(x), np.int(y)), 4, (255, 0, 0), -1, 8, 0)
cv.imshow("fit circle", src)
cv.imwrite("D:/fitcircle.png", src)
吾心信其可行,則移山填海之難,終有成功之日;
吾心信其不可行,則反掌折枝之易,亦無收效之期也
Ⅷ Python科學計算——任意波形擬合
任意波形的生成 (geneartion of arbitrary waveform) 在商業,軍事等領域都有著重要的應用,諸如空間光通信 (free-space optics communication), 高速信號處理 (high-speed signal processing),雷達 (radar) 等。在任意波形生成後, 如何評估生成的任意波形 成為另外一個重要的話題。
假設有一組實驗數據,已知他們之間的函數關系:y=f(x),通過這些信息,需要確定函數中的一些參數項。例如,f 是一個線型函數 f(x)=k*x+b,那麼參數 k 和 b 就是需要確定的值。如果這些參數用 p 表示的話,那麼就需要找到一組 p 值使得如下公式中的 S 函數最小:
這種演算法被稱之為 最小二乘擬合 (least-square fitting)。scipy 中的子函數庫 optimize 已經提供實現最小二乘擬合演算法的函數 leastsq 。下面是 leastsq 函數導入的方式:
scipy.optimize.leastsq 使用方法
在 Python科學計算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 對數字示波器採集的三角波數據導入進行了介紹,今天,就以 4GHz三角波 波形的擬合為案例介紹任意波形的擬合方法。
在 Python科學計算——如何構建模型? 一文中,討論了如何構建三角波模型。在標准三角波波形的基礎上添加了 橫向,縱向的平移和伸縮特徵參數 ,最後添加了 雜訊參數 模擬了三角波幅度參差不齊的隨機性特徵。但在波形擬合時,並不是所有的特徵參數都要納入考量,例如,雜訊參數應是 波形生成系統 的固有特徵,正因為它的存在使得產生的波形存在瑕疵,因此,在進行波形擬合並評估時,不應將雜訊參數納入考量,最終模型如下:
在調用 scipy.optimize.leastsq 函數時,需要構建誤差函數:
有時候,為了使圖片有更好的效果,需要對數據進行一些處理:
leastsq 調用方式如下:
合理的設置 p0 可以減少程序運行時間,因此,可以在運行一次程序後,用擬合後的相應數據對 p0 進行修正。
在對波形進行擬合後,調用 pylab 對擬合前後的數據進行可視化:
均方根誤差 (root mean square error) 是一個很好的評判標准,它是觀測值與真值偏差的平方和觀測次數n比值的平方根,在實際測量中,觀測次數n總是有限的,真值只能用最可信賴(最佳)值來代替.方根誤差對一組測量中的特大或特小誤差反映非常敏感,所以,均方根誤差能夠很好地反映出測量的精密度。
RMSE 用程序實現如下:
擬合效果,模型參數輸出:
leastsq 函數適用於任何波形的擬合,下面就來介紹一些常用的其他波形:
Ⅸ Python最小二乘法擬合與作圖
在函數擬合中,如果用p表示函數中需要確定的參數,那麼目標就是找到一組p,使得下面函數S的值最小:
這種演算法稱為最小二乘法擬合。Python的Scipy數值計算庫中的optimize模塊提供了 leastsq() 函數,可以對數據進行最小二乘擬合計算。
此處利用該函數對一段弧線使用圓方程進行了擬合,並通過Matplotlib模塊進行了作圖,程序內容如下:
Python的使用中需要導入相應的模塊,此處首先用 import 語句
分別導入了numpy, leastsq與pylab模塊,其中numpy模塊常用用與數組類型的建立,讀入等過程。leastsq則為最小二乘法擬合函數。pylab是繪圖模塊。
接下來我們需要讀入需要進行擬合的數據,這里使用了 numpy.loadtxt() 函數:
其參數有:
進行擬合時,首先我們需要定義一個目標函數。對於圓的碧帶方程,我們需要圓心坐標(a,b)以及半徑r三個參數,方便起見用p來存儲:
緊接著就可以進行擬合了, leastsq() 函數需要至少提供擬合的函數友喚名與參數的初始值:
返回的悔告蘆結果為一數組,分別為擬合得到的參數與其誤差值等,這里只取擬合參數值。
leastsq() 的參數具體有:
輸出選項有:
最後我們可以將原數據與擬合結果一同做成線狀圖,可採用 pylab.plot() 函數:
pylab.plot() 函數需提供兩列數組作為輸入,其他參數可調控線條顏色,形狀,粗細以及對應名稱等性質。視需求而定,此處不做詳解。
pylab.legend() 函數可以調控圖像標簽的位置,有無邊框等性質。
pylab.annotate() 函數設置注釋,需至少提供注釋內容與放置位置坐標的參數。
pylab.show() 函數用於顯示圖像。
最終結果如下圖所示:
用Python作科學計算
numpy.loadtxt
scipy.optimize.leastsq