对模型方差和偏差的解释之一:过拟合
原文:http://blog.csdn.net/vivihe0/article/details/33317041
在說到模型過擬合問題的時候,我們經常聽說到模型的方差和偏差,本系列就通過多項式擬合為例來說明什么是模型的方差和偏差,進而說明模型復雜度與模型預測效果之間的關系。
我們通過計算機產生樣本數據點來進行多項式擬合。為了能在2維平面上方便顯示擬合的函數,我們的輸入向量和輸出向量都是1維的。我們產生數據的函數是:
y = sin(2*pi*x)
根據這個函數,我們以(0,0.1,....,0.9,1)這11個點作為輸入樣本x,產生y值,然后再將一個均值為0,標準差為0.3的正態分布 噪聲項疊加在y上,產生了目標輸出樣本t。我們用這11個樣本點來擬合4種不同階數的多項式,將其對應的曲線再分別與真實的函數關系y = sin(2*pi*x)的曲線做對比。這樣可以看出我們擬合的曲線有沒有提取出11個樣本點背后隱含的函數關系。
注意,如果是在實際應用中,我們并不知道產生數據的真實函數關系。在那種情況下,我們的目標是在不知道真實函數關系的情況下,僅僅通過10個樣本點,擬合一條曲線,然后對未知的x值預測其t值。而在本文中,我們是知道產生數據的真實函數關系的。
下面是相應的MATLAB代碼,在這里我們直接使用MATLAB的多項式擬合函數polyfit和polyval。polyfit函數可以計算指定階數多項式擬合的系數,polyfit函數根據系數來計算給定輸入變量的輸出值。其具體的使用細節見下面的代碼。
[plain] view plaincopy注意,圖中的藍線是產生數據點真實的函數關系,圈是數據點,而紅線是擬合的多項式曲線。
從圖中可以看出,階數為1和2時,擬合的效果不好,擬合的曲線與正弦曲線y = sin(2*pi*x)差距甚遠。在階數為3的時候,擬合的效果較好。當我們把階數增加到9的時候,多項式對10個數據點有著完美的擬合,實際上擬合曲線 準確地穿過了10個樣本點,但是擬合曲線與y = sin(2*pi*x)卻差距很大。
我們把前2個子圖的情況叫做欠擬合,在這種情況下,由于模型的階數較低,用于擬合的模型不夠靈活,所以沒有有效提取出數據包含的信息。最后一個子圖 的情況叫做過擬合,在這種情況下,模型過分靈活,以至于能夠適應數據的任何隨機的波動,這樣擬合的曲線就把數據包含的噪聲也作為了有價值的信息而加以利用 了。所以說這兩種情況都是需要避免的,我們需要的是在這兩種情況之間做一個折中,也就是擬合的模型既不能太復雜也不能太簡單。
當然你會說,在實際應用的情況下,我們不知道數據是由什么函數產生的(也就是我們無法畫出圖中的藍線),那么如何判斷有沒有過擬合呢?且聽下回。
好了,本文的結論:過猶不及。
總結
以上是生活随笔為你收集整理的对模型方差和偏差的解释之一:过拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL札记3-2(hashtable关联
- 下一篇: android-menudrawer 和