線性模型(二)之多項(xiàng)式擬合
站在用戶的角度思考問題,與客戶深入溝通,找到拜城網(wǎng)站設(shè)計(jì)與拜城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋拜城地區(qū)。
1. 多項(xiàng)式擬合問題
??多項(xiàng)式擬合(polynominal curve fitting)是一種線性模型,模型和擬合參數(shù)的關(guān)系是線性的。多項(xiàng)式擬合的輸入是一維的,即x=xx=x,這是多項(xiàng)式擬合和線性回歸問題的主要區(qū)別之一。
??多項(xiàng)式擬合的目標(biāo)是構(gòu)造輸入xx的MM階多項(xiàng)式函數(shù),使得該多項(xiàng)式能夠近似表示輸入xx和輸出yy的關(guān)系,雖然實(shí)際上xx和yy的關(guān)系并不一定是多項(xiàng)式,但使用足夠多的階數(shù),總是可以逼近表示輸入xx和輸出yy的關(guān)系的。
??多項(xiàng)式擬合問題的輸入可以表示如下:
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
??目標(biāo)輸出是得到一個(gè)多項(xiàng)式函數(shù):
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
其中MM表示最高階數(shù)為MM。
??可見在線性擬合的模型中,共包括了(M+1)(M+1)個(gè)參數(shù),而該模型雖然不是輸入xx的線性函數(shù),但卻是(M+1)(M+1)個(gè)擬合參數(shù)的線性函數(shù),所以稱多項(xiàng)式擬合為線性模型。對(duì)于多項(xiàng)式擬合問題,其實(shí)就是要確定這(M+1)(M+1)個(gè)參數(shù),這里先假設(shè)階數(shù)MM是固定的(MM是一個(gè)超參數(shù),可以用驗(yàn)證集來確定MM最優(yōu)的值,詳細(xì)的關(guān)于MM值確定的問題,后面再討論),重點(diǎn)就在于如何求出這(M+1)(M+1)個(gè)參數(shù)的值。
2.優(yōu)化目標(biāo)
??多項(xiàng)式擬合是利用多項(xiàng)式函數(shù)逼近輸入xx和輸出yy的函數(shù)關(guān)系,通過什么指標(biāo)來衡量某個(gè)多項(xiàng)式函數(shù)的逼近程度呢?(其實(shí)這就是誤差/損失函數(shù))。擬合/回歸問題常用的評(píng)價(jià)指標(biāo)是均方誤差(在機(jī)器學(xué)習(xí)中的模型評(píng)估與度量博客中,我進(jìn)行了介紹)。多項(xiàng)式擬合問題也同樣采用該評(píng)價(jià)指標(biāo),以均方誤差作為誤差/損失函數(shù),誤差函數(shù)越小,模型越好。
E(w,b)=1N∑i=1N[f(xi)?yi]2
E(w,b)=1N∑i=1N[f(xi)?yi]2
??系數(shù)1N1N是一常數(shù),對(duì)優(yōu)化結(jié)果無影響,可以去除,即將均方誤差替換為平方誤差:
E(w,b)=∑i=1N[f(xi)?yi]2
E(w,b)=∑i=1N[f(xi)?yi]2
?? 到這里,就成功把多項(xiàng)式擬合問題變成了最優(yōu)化問題,優(yōu)化問題可表示為:
argminw,bE(w,b)
arg?minw,b?E(w,b)
即需要求得參數(shù){w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那么如何對(duì)該最優(yōu)化問題求解呢?
3. 優(yōu)化問題求解
3.1 求偏導(dǎo),聯(lián)立方程求解
?? 直觀的想法是,直接對(duì)所有參數(shù)求偏導(dǎo),令偏導(dǎo)為0,再聯(lián)立這M+1M+1個(gè)方程求解(因?yàn)楣灿蠱+1M+1個(gè)參數(shù),故求偏導(dǎo)后也是得到M+1M+1個(gè)方程)。
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)對(duì)各個(gè)參數(shù)求偏導(dǎo),如下:
?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]
求導(dǎo)之后,將各個(gè)點(diǎn)(xi,yi)(xi,yi)的值帶入偏導(dǎo)公式,聯(lián)立方程求解即可。
??針對(duì)該解法,可以舉個(gè)例子詳細(xì)說明,比如有兩個(gè)點(diǎn)(2,3),(5,8)(2,3),(5,8),需要利用二階多項(xiàng)式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b擬合。求解過程如下:
該二階多項(xiàng)式對(duì)參數(shù)求偏導(dǎo)得到
?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]
將點(diǎn)(2,3),(5,8)(2,3),(5,8)帶入方程,可以得到3個(gè)方程,
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
聯(lián)立這三個(gè)方程求解,發(fā)現(xiàn)有無窮多的解,只能得到3w1+21w2=53w1+21w2=5,這三個(gè)方程是線性相關(guān)的,故沒有唯一解。
??該方法通過求偏導(dǎo),再聯(lián)立方程求解,比較復(fù)雜,看著也很不美觀。那么有沒有更加方便的方法呢?
3.2 最小二乘法
?? 其實(shí)求解該最優(yōu)化問題(平方和的最小值)一般會(huì)采用最小二乘法(其實(shí)最小二乘法和求偏導(dǎo)再聯(lián)立方程求解的方法無本質(zhì)區(qū)別,求偏導(dǎo)也是最小二乘法,只是這里介紹最小二乘的矩陣形式而已)。最小二乘法(least squares),從英文名非常容易想到,該方法就是求解平方和的最小值的方法。
??可以將誤差函數(shù)以矩陣的表示(NN個(gè)點(diǎn),最高M(jìn)M階)為:
∥Xw?y∥2
‖Xw?y‖2
其中,把偏置bb融合到了參數(shù)ww中,
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX則表示輸入矩陣,
??????11...1x1x2...xNx21x22...x2N............xM1xM2...xMN??????
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy則表示標(biāo)注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最優(yōu)化問題可以重新表示為
minw∥Xw?y∥2
minw‖Xw?y‖2
對(duì)其求導(dǎo),
?∥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
在繼續(xù)對(duì)其求導(dǎo)之前,需要先補(bǔ)充一些矩陣求導(dǎo)的先驗(yàn)知識(shí)(常見的一些矩陣求導(dǎo)公式可以參見轉(zhuǎn)載的博客),如下:
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
根據(jù)上面的矩陣求導(dǎo)規(guī)則,繼續(xù)進(jìn)行損失函數(shù)的求導(dǎo)
?∥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.令求導(dǎo)結(jié)果等于0,即可以求導(dǎo)問題的最小值。
2XTXw?2XTy=0w=(XTX)?1XTy
2XTXw?2XTy=0w=(XTX)?1XTy
??再利用最小二乘法的矩陣形式對(duì)前面的例子進(jìn)行求解,用二階多項(xiàng)式擬合即兩個(gè)點(diǎn)(2,3),(5,8)(2,3),(5,8)。
表示輸入矩陣 XX和標(biāo)簽向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
計(jì)算XTXXTX
XTX=???272972913329133641???
XTX=[272972913329133641]
矩陣求逆,再做矩陣乘法運(yùn)算
但 XTXXTX不可逆,故無唯一解。
??關(guān)于矩陣的逆是否存在,可以通過判斷矩陣的行列式是否為0(det(A)=?0det(A)=?0 來判斷,也可以通過初等行變換,觀察矩陣的行向量是否線性相關(guān),在這個(gè)例子下,矩陣不可逆,故有無窮多解。但如果新增一個(gè)點(diǎn)(4,7)(4,7),則就可以解了。
??其實(shí)這和數(shù)據(jù)集的點(diǎn)數(shù)和選擇的階數(shù)有關(guān),如果點(diǎn)數(shù)小于階數(shù)則會(huì)出現(xiàn)無窮解的情況,如果點(diǎn)數(shù)等于階數(shù),那么剛好有解可以完全擬合所有數(shù)據(jù)點(diǎn),如果點(diǎn)數(shù)大于階數(shù),則會(huì)求的近似解。
??那么對(duì)于點(diǎn)數(shù)小于階數(shù)的情況,如何求解?在python的多項(xiàng)式擬合函數(shù)中是可以擬合的,而且效果不錯(cuò),具體算法不是很了解,可以想辦法參考python的ployfit()函數(shù)的實(shí)現(xiàn)。
4. 擬合階數(shù)的選擇
?? 在前面的推導(dǎo)中,多項(xiàng)式的階數(shù)被固定了,那么實(shí)際場(chǎng)景下應(yīng)該如何選擇合適的階數(shù)MM呢?
一般會(huì)選擇階數(shù)MM小于點(diǎn)數(shù)NN
把訓(xùn)練數(shù)據(jù)分為訓(xùn)練集合驗(yàn)證集,在訓(xùn)練集上,同時(shí)用不同的MM值訓(xùn)練多個(gè)模型,然后選擇在驗(yàn)證集誤差最小的階數(shù)script type="math/tex" id="MathJax-Element-5573"M/script
很多業(yè)務(wù)場(chǎng)景中,我們希望通過一個(gè)特定的函數(shù)來擬合業(yè)務(wù)數(shù)據(jù),以此來預(yù)測(cè)未來數(shù)據(jù)的變化趨勢(shì)。(比如用戶的留存變化、付費(fèi)變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項(xiàng)式擬合 和 自定義函數(shù)擬合。
通過多項(xiàng)式擬合,我們只需要指定想要擬合的多項(xiàng)式的最高項(xiàng)次是多少即可。
運(yùn)行結(jié)果:
對(duì)于自定義函數(shù)擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運(yùn)行結(jié)果:
拉格朗日插值Python代碼實(shí)現(xiàn)
1. 數(shù)學(xué)原理
對(duì)某個(gè)多項(xiàng)式函數(shù)有已知的k+1個(gè)點(diǎn),假設(shè)任意兩個(gè)不同的都互不相同,那么應(yīng)用拉格朗日插值公式所得到的拉格朗日插值多項(xiàng)式為:
其中每個(gè)lj(x)為拉格朗日基本多項(xiàng)式(或稱插值基函數(shù)),其表達(dá)式為:
2. 輕量級(jí)實(shí)現(xiàn)
利用
直接編寫程序,可以直接插值,并且得到對(duì)應(yīng)的函數(shù)值。但是不能得到系數(shù),也不能對(duì)其進(jìn)行各項(xiàng)運(yùn)算。
123456789101112
def?h(x,y,a):????ans=0.0????for?i?in?range(len(y)):????????t=y[i]????????for?j?in?range(len(y)):????????????if?i !=j:????????????????t*=(a-x[j])/(x[i]-x[j])????????ans?+=t????return?ansx=[1,0]y=[0,2]print(h(x,y,2))
上述代碼中,h(x,y,a)就是插值函數(shù),直接調(diào)用就行。參數(shù)說明如下:
x,y分別是對(duì)應(yīng)點(diǎn)的x值和y值。具體詳解下解釋。
a為想要取得的函數(shù)的值。
事實(shí)上,最簡(jiǎn)單的拉格朗日插值就是兩點(diǎn)式得到的一條直線。
例如:
p點(diǎn)(1,0)q點(diǎn)(0,2)
這兩個(gè)點(diǎn)決定了一條直線,所以當(dāng)x=2的時(shí)候,y應(yīng)該是-2
該代碼就是利用這兩個(gè)點(diǎn)插值,然后a作為x=2調(diào)用函數(shù)驗(yàn)證的。
3. 引用庫(kù)
3.1 庫(kù)的安裝
主要依賴與 scipy。官方網(wǎng)站見:
安裝的方法很簡(jiǎn)單,就是使用pip install scipy 如果失敗,則將whl文件下載到本地再利用命令進(jìn)行安裝。
可能如果沒有安裝numpy
3.2 庫(kù)的使用
from scipy.interplotate import lagrange
直接調(diào)用lagrange(x,y)這個(gè)函數(shù)即可,返回 一個(gè)對(duì)象。
參數(shù)x,y分別是對(duì)應(yīng)各個(gè)點(diǎn)的x值和y值。
例如:(1,2) (3,5) (5,9)這三個(gè)點(diǎn),作為函數(shù)輸入應(yīng)該這么寫:
x=[1,3,5]
y =[2, 5, 9]
a=lagrange(x,y)
直接輸出該對(duì)象,就能看到插值的函數(shù)。
利用該對(duì)象,能得到很多特性。具體參見:
a.order得到階
a[]得到系數(shù)
a()得到對(duì)應(yīng)函數(shù)值
此外可以對(duì)其進(jìn)行加減乘除運(yùn)算
3.3 代碼實(shí)現(xiàn)
1234567? ?from?scipy.interpolate?import?lagrangex=[1,2,3,4,7]y=[5,7,10,3,9]a=lagrange(x,y)print(a)print(a(1),a(2),a(3))print(a[0],a[2],a[3])? ?
結(jié)果是:
class 'numpy.lib.polynomial.poly1d' 4
4 ? ? ? ? ? ?3 ? ? ? ? ? ? ?2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13
5.0 7.0 10.0
28.1333333333 30.6527777778 -7.30555555556
解釋:
class 'numpy.lib.polynomial.poly1d' 4
這一行是輸出a的類型,以及最高次冪。
4 ? ? ? ? ? ?3 ? ? ? ? ? ? ?2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13
第二行和第三行就是插值的結(jié)果,顯示出的函數(shù)。
第二行的數(shù)字是對(duì)應(yīng)下午的x的冪,如果對(duì)應(yīng)不齊,則是排版問題。
5.0 7.0 10.0
第四行是代入的x值,得到的結(jié)果。
也就是說,用小括號(hào)f(x)的這種形式,可以直接得到計(jì)算結(jié)果。
28.1333333333 30.6527777778 -7.30555555556
他們以后被命名 Adrien-Marie Legendre. 這 常微分方程 頻繁地運(yùn)用到 物理 并且其他技術(shù)領(lǐng)域。 特別是當(dāng)在球狀坐標(biāo)解決 Laplace的等式 (和關(guān)連 偏微分方程) 時(shí).
Legendre微分方程也許使用標(biāo)準(zhǔn)解決 電源串聯(lián) 方法。 等式有 規(guī)則單一點(diǎn) 在 x= ± 1如此,級(jí)數(shù)解關(guān)于起源只將一般來說,聚合為 |x| 1. 當(dāng) n是整數(shù),解答Pn是規(guī)則的(x) x=1也是正規(guī)兵在 x=-1和系列為這種解答終止(即。 是多項(xiàng)式)。