matlab—迴歸與內插(完結)
polyfit()
假設當前有一組身高資料,與其對應的有一組體重資料,我們要分析兩者之間是否有某種關聯,這時就需要用到曲線擬合函式 polyfit
,其呼叫格式為: fit=polyfit(xdata,ydata,n)
,其中 n
表示多項式的最高階數, xdata
, ydata
為將要擬合的資料,輸出的引數 fit 為 n+1 個係數,一般情況 polyfit
與 polyval
一起使用,進行繪圖
x = [-1.2 -0.5 0.3 0.9 1.0 2.6 3.0 3.5]; y = [-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0]; fit = polyfit(x,y,7); xfit = x(1):0.1:x(end); yfit = polyval(fit,xfit); plot(x,y,'ro',xfit,yfit);
scatter() & corrcoef()
這裡介紹兩個函式,一個是畫散點圖的函式 scatter
,其呼叫格式為: scatter(xdata,ydata)
另一個是求出x-y之間線性係數大小的函式 corrcoef
,其呼叫格式為: corrcoef(xdata,ydata)
,這裡要說明一點, corrcoef
函式返回的是一個2*2的矩陣,(1,1)和(2,2)分別是 x-x
和 y-y
的相關係數,必定是 1,(1,2)和(2,1)分別是 x-y
和 y-x
的相關係數,必定相等
x = [-1.2 -0.5 0.3 0.9 1.0 2.6 3.0 3.5]; y = [-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0]; scatter(x,y); corrcoef(x,y)
regress()
Regress
函式的作用也是做資料擬合,只不過它所呈現的資訊更多,其呼叫格式為: [b,bint,r,rint,stats] = regress(y,x,alpha)
- y:多元擬合的變數值的向量
- x 多元擬合的自變數的值的矩陣
- alpha:顯著性水平,預設的時候為 0.05
- b:迴歸得到的自變數係數
- bint:b 的 95% 的置信區間矩陣
- r:殘差向量
- rint:區間矩陣
插值
擬合與插值不同的地方在於,擬合出的函式曲線不一定會經過所有的點,只能說大概呈現一個趨勢,而插值一定會經過所有的資料點
插值的作用:比如我們已知 t=1 時a=2,t=2 時a=3,那麼 t=1.5 時a = 多少呢?所以插值就是幫助我們求某處的資料值
其呼叫格式為: yi=interp1(x,y,xi)
,其中,x,y 是我們已知的資料值,我們現在要求,經過一系列(x,y)點的曲線在 xi 時對應的 yi 值
語法形式 | 說明 |
---|---|
y=interp1(x,Y,xi) |
由已知點集 (x,Y) 插值計算 xi 上的函式值 |
y=interp1(x,Y,xi) |
相當於 x=1:length(Y) 的 interp(x,Y,xi) |
y=interp1(x,Y,xi,method) |
用指定插值方法計算插值點 xi 上的函式值
y=interp1(x,Y,xi,method,'extrap')
| 對 xi 中超出已知點集的插值點用指定插值方法計算函式值
y=interp1(x,Y,xi,method,'extrap',extrapval)
| 用指定方法插值 xi 上的函式值,超出已知點集處函式值取 extrapval
y=interp1(x,Y,xi,method,'pp')
|
用指定方法插值,但返回結果為分段多項式
Method | 方法描述 |
---|---|
Nearest | 最鄰近插值: 插值點處函式值與插值點最鄰近的已知點函式值相等 |
liner | 分段線性插值:插值點處函式值由連線其最鄰近的兩側點的線性函式預測。Matlab 中 interp1 的預設方法 |
spline | 樣條插值:預設為三次樣條插值。可用 spline 函式替代 |
pchip | 三次 Hermite 多項式插值,可用 pchip 函式替代 |
Nearest Spline Cubic
x = 0 : 2 * pi; y = sin(x); xx = 0 : 0.5 : 2 * pi; %interp1對sin函式進行分段線性插值,呼叫interp1的時候,預設的是分段線性插值 y1 = interp1(x,y,xx); subplot(2,2,1);plot(x,y,'o',xx,y1,'r'); title('分段線性插值') %臨近插值 y2 = interp1(x,y,xx,'nearnest'); subplot(2,2,2);plot(x,y,'o',xx,y2,'r'); title('鄰近插值') %球面線性插值 y3 = interp1(x,y,xx,'spline'); subplot(2,2,3);plot(x,y,'o',xx,y3,'r'); title('球面線性插值') %三次多項式插值 y4 = interp1(x,y,xx,'PCHIP'); subplot(2,2,4);plot(x,y,'o',xx,y4,'r'); title('三次多項式插值')
插值不止可以用於平面,還可以用於三維圖,函式是 interp2
,引數及方法類似, zi = interp2(x,y,z,xi,yi,method)
,有需要的可以去Google