如何規範確定一條多項式曲線的階數? | 知乎問答精選

 

A-A+

如何規範確定一條多項式曲線的階數?

2019年01月03日 知乎問答精選 暫無評論 閱讀 6 ℃ 次

【慧航的回答(11票)】:

謝邀。非常抱歉剛剛看到這個問題,希望不晚。

如果你試過上述方法不行的話,可以考慮一下cross-validation的方法。這個方法很簡單,假設你有N個樣本,那麼對於一個階數L,你做N次擬合,每次擬合把第i個變量刪掉,然後再計算第i個觀測的殘差的平方和,然後找到那個使得這個數值最小的L。即:

其中

為刪掉第i個觀測之後的估計值。

這個方法的缺點是比較慢,比如如果你有10000個觀測,要做10000*L次擬合。

不過優點也是有的,就是總能保證模型不被過度擬合。比如你可以試一下,如果本身這個數據就是多項式生成的,這個方法選出來的階數跟實際生成數據的階數是一樣的,極少有例外。

這裡給你一個最小二乘擬合的julia code,你可以參照一下:

#!/usr/bin/juliaN=300x=randn(N)y=exp(x)X=ones(N)last_obj=-log(0)obj=0.0l=0while truel=l+1X=[X x.^l]sum_resid=0for i=1:Nxx=X'*Xxx=xx-X[i,:]'*X[i,:]xy=X'*yxy=xy-X[i]*y[i]beta=xxxysum_resid=sum_resid+(y[i]-X[i,:]*beta).^2endobj=sum_resid[1]/Nprintln("l=$(l), obj=$(obj)")if last_obj<objl=l-1breakendlast_obj=objendprintln("Optimal l=$(l)")Result:l=1, obj=0.9881153660813413l=2, obj=0.12672514229110396l=3, obj=0.07543028393248195l=4, obj=0.544693938678342Optimal l=3

【知乎用戶的回答(0票)】:

第一,如果你已經有先驗知識告訴你多項式的階數到底是多少,那麼就沒什麼好說的了,用那個階數就好,如果你不知道那個階數是多少,確定階數是否足夠最簡單的辦法就是畫一個殘差圖,如果殘差與自變量沒有相關關係,那麼就可以認為階數已經足夠。你可以在小於等於當前多項式階數的多項式中繼續搜素。第二,如果你不做外推,只做內插,那麼最高次項的係數很小時其對整個模型的影響也很小這句話總的來說還是對的,至於多少算小還需要根據你的數據自己判斷。但如果需要外推,那麼情況完全不同,有沒有最高次項模型的表現是完全不同的。第三,為什麼一定要用R^2呢,AIC,BIC不行嗎?第四,方法有很多,你可以用Forward/Backward Stepwise selection 或者用Lasso。歸根結底,這其實是一道變量選擇(Feature selection)的問題。

標籤:-數學 -統計學 -回歸分析 -函數 -多項式擬合


相關資源:





給我留言