如何規範確定一條多項式曲線的階數?
大家好,我是一名留學海外的學生,現在在做畢業設計,遇到了一點問題。
畢設的任務主要是用matlab對一大堆曲線進行多項式擬合,來確定他們的階數。
但是至今我沒有找到一個比較合適的標準。
之前我用的是matlab曲線擬合工具箱里給出的四個擬合優度的指標中的r方。但問題是,擬合的階數越高,擬合優度一定會越好。於是我就自說自話把r方的臨界值定為了0.998(因為據我的觀察,我認為0.998的曲線才能足夠描述原曲線)。但是問了很多人都說不需要那麼高,甚至0.8就夠了。可是事實是,我把r方等於0.97x的曲線給導師看,導師也承認還差得遠。。。而我也覺得僅憑我的經驗,用一個自定的r方的臨界值來確定方程的階數不太正式。
於是我就開始找,有沒有能平衡擬合方程的參數數量和擬合優度的方法。我查過了aic,bic,和一個extra sum of square f test,並在我的案例中進行了嘗試,結果這些方法的結論都是次數越高越好。。
所以我至今沒有找到一個比較規範的方法。現在我有幾個問題:
1. 如果得出擬合方程次數高於預期,屬於過度擬合嗎?如何判斷是否過度擬合?
2. 可否根據擬合方程最高項係數的數量級來判斷多項式的階數,因為當一個多項式方程的最高項的係數很小時,應該就近似於一個比原方程低一階的多項式方程了吧。如果可行,有沒有相關的假設檢驗或是其他比較正規的方法來確定呢?
3. 如果最後還是用r方,怎麼能比較規範的制定一個r方的臨界值?
4. 有沒有別的方法能確定一個一條多項式曲線的階數?(別跟我說用眼看,那我不睡覺看一個禮拜也看不完。。)希望各路能人能幫我度過這個難關,萬分感謝!
謝邀。非常抱歉剛剛看到這個問題,希望不晚。
如果你試過上述方法不行的話,可以考慮一下cross-validation的方法。這個方法很簡單,假設你有N個樣本,那麼對於一個階數L,你做N次擬合,每次擬合把第i個變數刪掉,然後再計算第i個觀測的殘差的平方和,然後找到那個使得這個數值最小的L。即:
其中為刪掉第i個觀測之後的估計值。
這個方法的缺點是比較慢,比如如果你有10000個觀測,要做10000*L次擬合。
不過優點也是有的,就是總能保證模型不被過度擬合。比如你可以試一下,如果本身這個數據就是多項式生成的,這個方法選出來的階數跟實際生成數據的階數是一樣的,極少有例外。
這裡給你一個最小二乘擬合的julia code,你可以參照一下:
#!/usr/bin/julia
N=300
x=randn(N)
y=exp(x)
X=ones(N)
last_obj=-log(0) 過擬合就是一個 bias versus variance 的問題,所以我們可以穩妥的用subsampling,就是@慧航 所說的 cross validatio 這是頻率派的手法;另外可以用先驗貝葉斯來推,目指 machine learning: a probabilistic perspective 剛剛給別人回答了一個類似的問題,有一點想法
obj=0.0
l=0
while true
l=l+1
X=[X x.^l]
sum_resid=0
for i=1:N
xx=X"*X
xx=xx-X[i,:]"*X[i,:]
xy=X"*y
xy=xy-X[i]*y[i]
beta=xxxy
sum_resid=sum_resid+(y[i]-X[i,:]*beta).^2
end
obj=sum_resid[1]/N
println("l=$(l), obj=$(obj)")
if last_obj&
既然你可以用subsampling來算 variance然後你可以找一個 error = sqrt{bias^2+variance} 最小的值
推薦 an intro to non-paramemeric estimation
其實擬合階數並不取決於 r 的大小,而是 取決於 delta r / delta n
決定 r 的是你擬合 model 的可靠性和 error 的情況,如果 model 本身沒有那麼好,你擼出一個很高的 r 很容易就 overfitting
引理1: 首先,我們考慮 x_i 和 y_i 的相關性是否顯著可用 cor(x,y) &> k sqrt(1/n) 來判斷
為簡便, E(x) = 0 E(y) = 0 Var(x) = 1, Var(y) = 1
Consider a null hypo x_i independent y_j
V(cor(x,y)) approx left&< 1/n^2 sum x_i y_i x_j y_j
ight&> = left&< 1/n^2 sum x_i^2 y_i^2
ight&> approx 1/n
於是對於一個 signal-noise ratio = k 的 rejection,可以考慮等同於 cor(x,y) &> k sqrt(1/n)
每增加一個階數,相當於增加了一個解釋變數
y_1 = x
y_n = x^n - proj_{y_1:n-1}(x^n)
y_n 指的是 x^n 中不能被 x... x^{n-1} 擬合的部分
於是我們考慮 cor( f(x) , y_n) 是否大於 ksqrt(1/n) 就行了
PS: 其實並沒有一條曲線的階數,而是你有這麼多觀測點,你能夠擬合出的最高階數。更高的話, reliability beyond knowledge 了
其實去計算貝葉斯模型證據,即是一個很好的確定多項式係數的方法。
第一,如果你已經有先驗知識告訴你多項式的階數到底是多少,那麼就沒什麼好說的了,用那個階數就好,如果你不知道那個階數是多少,確定階數是否足夠最簡單的辦法就是畫一個殘差圖,如果殘差與自變數沒有相關關係,那麼就可以認為階數已經足夠。你可以在小於等於當前多項式階數的多項式中繼續搜素。第二,如果你不做外推,只做內插,那麼最高次項的係數很小時其對整個模型的影響也很小這句話總的來說還是對的,至於多少算小還需要根據你的數據自己判斷。但如果需要外推,那麼情況完全不同,有沒有最高次項模型的表現是完全不同的。第三,為什麼一定要用R^2呢,AIC,BIC不行嗎?第四,方法有很多,你可以用Forward/Backward Stepwise selection 或者用Lasso。歸根結底,這其實是一道變數選擇(Feature selection)的問題。
推薦閱讀:
※如何理解矩陣特徵值?
※數理邏輯=﹥ ,|-這兩個符號有什麼區別?
※柯潔與 AlphaGo 三場皆負,對圍棋今後的發展會有哪些影響?
※如何证明数学公式 1 + 1 = 2 的成立?
※卵石為什麼多是扁的橢球體?水中阻力最小的形狀不是雨滴形狀嗎?