Matlab2016做曲線擬合(Curve Fitting)(2)

Polynomial Models(多項式模型)

常見多項式的基本模型:
這裏寫圖片描述
其中 n + 1 是多項式的階, n 是多項式的維度, 1 ≤ n ≤9。該順序給出了合適的係數個數, 並給出了預測變量最高的維度。
在本文中, 多項式按其度來描述。例如, 三維 (立方) 多項式表示如下:
這裏寫圖片描述
當需要一個簡單的經驗模型時, 通常使用多項式。我們可以使用多項式模型進行插值或外推, 或者使用全局擬合來描述數據。例如, 0 至760o 溫度範圍內的 J 型熱電偶的溫度-電壓轉換是用第七維度多項式描述的。

注:如果不需要全局參數擬合, 並且希望最大限度地提高擬合的靈活性, 則分段多項式可能提供最佳方法。有關詳細信息, 請參閱非參數擬合。

多項式擬合的主要優點包括對數據的合理靈活性不是太複雜,而且它們是線性的,這意味着擬合過程很簡單。 主要缺點是高度配合會變得不穩定。 此外,任何程度的多項式都可以在數據範圍內提供良好的擬合,但可以在該範圍之外瘋狂地發散。 因此,在使用多項式進行外推時要格外小心。
當需要擬合高階多項式時,擬合過程使用預測值作爲具有非常大值的矩陣的基礎,這可能導致縮放問題。 爲了解決這個問題,應該將數據歸一化爲零均值,並將其標定爲單位標準偏差。 通過選擇曲線擬合應用中的中心和縮放複選框來標準化數據。

交互式擬合多項式模型

通過輸入 cftool 打開曲線擬合應用程序。或者, 單擊 “應用程序” 選項卡上的 Curve Fitting。
在曲線擬合應用程序中, 選擇曲線或曲面數據。
如果選擇曲線數據 (X 數據和 y 數據, 或只針對索引的 y 數據), 曲線擬合應用程序將創建默認的曲線擬合多項式。
如果選擇曲面數據 (X 數據、Y 數據和 Z 數據), 曲線擬合應用程序將創建缺省曲面擬合, 插值函數。將模型類型從插值函數更改爲多項式。
對於曲線, 多項式模型適合於 x 中的多項式。
這裏寫圖片描述
對於曲面, 多項式模型適合於 x 和 y 的多項式。
這裏寫圖片描述
您可以指定以下選項:
x和y輸入的維度:
對於曲線,x的度數可以達到9。
對於表面,x和y的度數可以達到5。
多項式的度是x和y度的最大值。 請參閱定義多項式曲面擬合的多項式術語。
使用的魯棒線性最小二乘擬合方法(Off,LAR或Bisquare)。
通過單擊適合選項設置界限或排除術語,可以通過將其邊界設置爲0來排除任何術語。
在“結果”窗格中查看模型項,係數值和擬合優度統計信息。
如果輸入變量具有非常不同的比例,請選中並清除中心並縮放複選框以查看擬閤中的差異。 結果窗格中的消息會在縮放時提示提高擬合度。

用擬合函數擬合多項式

此示例演示如何使用 “擬合函數” 將多項式與數據相擬合。步驟擬合和繪製多項式曲線和曲面, 指定擬合選項, 返回擬合統計的優點, 計算預測, 並顯示置信區間。
多項式庫模型是擬合和 fittype 函數的輸入參數。指定模型類型poly後跟 x (最多 9) 的度數, 或 x 和 y (最多 5)。例如, 指定一個具有 “poly2” 或具有 “poly33” 的立方曲面的二次曲線。
這裏需要解釋poly是什麼:
poly:Polynomial with specified roots or characteristic polynomial:具有指定根或特徵多項式的多項式
常用語法:

p = poly(r)
p = poly(A)

p=poly(r), 其中是r向量, 返回的是多項式的係數, 其根是 r 的元素。
p = poly(A),其中 A 爲 n*n的 矩陣, 返回矩陣的特徵多項式 (λI-A) 的 n+1 係數。
舉例:計算矩陣的特徵值, A。

>> A = [1 8 -10; -4 2 4; -5 2 8]

A =
     1     8   -10
    -4     2     4
    -5     2     8

>> e=eig(A)

e =
  11.6219 + 0.0000i
  -0.3110 + 2.6704i
  -0.3110 - 2.6704i

>> p=poly(e)
p =
    1.0000  -11.0000   -0.0000  -84.0000

由於 e 中的特徵值是 A 的特徵多項式的根, 所以利用poly來確定 e 中的特徵多項式。
創建和繪製二次多項式曲線

加載一些數據並擬合一個二次多項式。用字符串 “poly2” 指定二次或二度多項式

load census;
fitpoly2=fit(cdate,pop,'poly2')
% Plot the fit with the plot method.
plot(fitpoly2,cdate,pop)
% Move the legend to the top left corner.
legend('Location','NorthWest' );

生成結果如下:

fitpoly2 = 
     Linear model Poly2:
     fitpoly2(x) = p1*x^2 + p2*x + p3
     Coefficients (with 95% confidence bounds):
       p1 =    0.006541  (0.006124, 0.006958)
       p2 =      -23.51  (-25.09, -21.93)
       p3 =   2.113e+04  (1.964e+04, 2.262e+04)

這裏寫圖片描述
*創建三次曲線
擬合三次多項式 “poly3”*

fitpoly3=fit(cdate,pop,'poly3')
plot(fitpoly3,cdate,pop)

結果:

fitpoly3 = 

     Linear model Poly3:
     fitpoly3(x) = p1*x^3 + p2*x^2 + p3*x + p4
     Coefficients (with 95% confidence bounds):
       p1 =   3.855e-06  (-4.078e-06, 1.179e-05)
       p2 =    -0.01532  (-0.06031, 0.02967)
       p3 =       17.78  (-67.2, 102.8)
       p4 =       -4852  (-5.834e+04, 4.863e+04)

這裏寫圖片描述
指定擬合選項

fit3=fit(cdate, pop,'poly3','Normalize','on','Robust','on')
plot(fit3,cdate,pop)

輸出:

fit3 = 

     Linear model Poly3:
     fit3(x) = p1*x^3 + p2*x^2 + p3*x + p4
       where x is normalized by mean 1890 and std 62.05
     Coefficients (with 95% confidence bounds):
       p1 =     -0.4619  (-1.895, 0.9707)
       p2 =       25.01  (23.79, 26.22)
       p3 =       77.03  (74.37, 79.7)
       p4 =       62.81  (61.26, 64.37)

這裏寫圖片描述
要了解可以爲庫模型 “poly3” 設置哪些參數, 請使用 fitoptions 函數。

fitoptions poly3
ans =

    Normalize: 'off'
      Exclude: []
      Weights: []
       Method: 'LinearLeastSquares'
       Robust: 'Off'
        Lower: [1x0 double]
        Upper: [1x0 double]

指定 “gof” 輸出參數以獲取三次多項式擬合的擬合性統計信息。

[fit4, gof]=fit(cdate, pop,'poly3','Normalize','on');
gof

繪製殘差以評估擬合
若要繪製殘差, 請在繪圖方法中指定 “殘值” 作爲繪圖類型。

plot(fit4,cdate, pop,'residuals');

這裏寫圖片描述
檢查超出數據範圍的匹配項
默認情況下, 擬合在數據範圍內繪製。若要在不同的範圍內繪製一個擬合, 請在繪製匹配項之前設置座標軸的 x 限制。例如, 若要查看從擬合推斷出的值, 請將上限 x 限制設置爲2050。

plot( cdate, pop, 'o' );
xlim( [1900, 2050] );
hold on
plot( fit4 );
hold off

這裏寫圖片描述
繪製預測邊界
若要繪製預測邊界, 請使用 “predobs” 或 “predfun” 作爲繪圖類型。

plot(fit4,cdate,pop,'predobs')

這裏寫圖片描述
預測繪製預測邊界到2050:

plot( cdate, pop, 'o' );
xlim( [1900, 2050] )
hold on
plot( fit4, 'predobs' );
hold off

這裏寫圖片描述
現在我們就可以獲取新查詢點的信任界限並評估擬合一些新的查詢點。

cdateFuture = (2000:10:2020).';
popFuture = fit4( cdateFuture )

輸出:

popFuture =

  276.9632
  305.4420
  335.5066

使用 predint 方法計算未來人口預測95% 的置信限。

ci = predint( fit4, cdateFuture, 0.95, 'observation' )

輸出:

ci =

  267.8589  286.0674
  294.3070  316.5770
  321.5924  349.4208

可視化預測:

plot(cdate, pop, 'o');
xlim([1900, 2040])
hold on
plot(fit4)
h = errorbar(cdateFuture,popFuture,popFuture-ci(:,1),ci(:,2)-popFuture,'.');
hold off
legend('cdate v pop','poly3','prediction','Location','NorthWest')

結果:
這裏寫圖片描述

擬合和繪製多項式曲面

加載一些曲面數據, 並在 x 和 y 中擬合第四度多項式。

load franke;
fitsurface=fit([x,y],z, 'poly44','Normalize','on')
plot(fitsurface, [x,y],z)

輸出:

Linear model Poly44:
     fitsurface(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 
                    + p21*x^2*y + p12*x*y^2 + p03*y^3 + p40*x^4 + p31*x^3*y 
                    + p22*x^2*y^2 + p13*x*y^3 + p04*y^4
       where x is normalized by mean 1982 and std 868.6
       and where y is normalized by mean 0.4972 and std 0.2897
     Coefficients (with 95% confidence bounds):
       p00 =      0.3471  (0.3033, 0.3909)
       p10 =     -0.1502  (-0.1935, -0.107)
       p01 =     -0.4203  (-0.4637, -0.377)
       p20 =      0.2165  (0.1514, 0.2815)
       p11 =      0.1717  (0.1175, 0.2259)
       p02 =     0.03189  (-0.03351, 0.09729)
       p30 =     0.02778  (0.00749, 0.04806)
       p21 =     0.01501  (-0.002807, 0.03283)
       p12 =    -0.03659  (-0.05439, -0.01879)
       p03 =      0.1184  (0.09812, 0.1387)
       p40 =    -0.07661  (-0.09984, -0.05338)
       p31 =    -0.02487  (-0.04512, -0.004624)
       p22 =   0.0007464  (-0.01948, 0.02098)
       p13 =    -0.02962  (-0.04987, -0.009366)
       p04 =    -0.02399  (-0.0474, -0.0005797)

可視化:
這裏寫圖片描述
還是很酷炫的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章