使用 NAG MATLAB® 工具箱 - Part 3
本系列的文章可參考 http://tw.nag-gc.com/IndustryArticles/usingtoolboxmatlab.asp 以及 http://tw.nag-gc.com/IndustryArticles/usingtoolboxmatlabpart2.asp;本文中,我們將持續探索我們的工具箱, 並展示如何在 MATLAB 中使用我們的 NAG 程式庫,並利用 MATLAB 的圖形功能顯示結果。
注意: 本文中的範例皆是由我們的展示程式中截取的,若您直接以文中的 MATLAB 程式執行,也許無法完整的獲得如文中的結果。文中範例的完整的程式,請您自 此處下載。
G13 函數 - 時間序列分析
所謂時間序列指的是在某段時間中,收集潛在時間相依流程中的觀測點集合。NAG 的 G13 函數系列包含了許多調查與建構時間序列的統計模型; 由這些函數建構出的模型可以讓我們更了解資料的特性,或者是從時間序列中進行預測 (也就是對未來的行為進行預測)。 例如:一般說的 自我迴歸整合移動平均 (autoregressive integrated moving average) (ARIMA) 模型能夠預測時間序列,請看以下例子。
了解時間序列特性的第一步,是去計算它的 自相關函數,它描述了在不同時間點所存在的相關性 (依賴程度)。 將兩個不同時間段進行分割稱之為 lag,而自相關函數通常是依不同的 lag 值,以 自相關係數 來表示結果。 g13ab 函數能夠依許多基本的統計量,如平均值與變異數來計算這個係數。以下是程式片段:
|
因為 lag 是一個不連續的變數,自相關比較適合用直方圖表示 (或者稱 autocorrelogram),如下圖:
圖 1:計算時間序列的自相關函數
自相關函數包含了潛在時間相依流程的定量與定性訊息;本例中,當以 ARIMA 模型去擬合時間序列,可看出大約具有 11 周期的擺動。 autocorrelation 圖形的形狀可以顯現出模型參數。圖 1 中,可以了解到這個時間序列為 非週期性的,因此還需進一步探索。 如果相關係數在前面幾個 lags 中的值很高,然後快速下降,便是我們一般稱的 移動平均 (MA) 序列, 若結果以波形方式呈現,便為 自迴歸 (AR) 序列。大部分的例子中,通常需要使用 ARIMA 模型 (同時擁有 AR 與 MA) 去擬合序列的資料。
除了自相關函數,我們也可以自 偏自相關 (partial autocorrelation) 函數 的圖形中,獲得其他更多的訊息。 我們可以在以上的例子中以 g13ac 函數取代 g13ab 函數的呼叫。
本範例的 MATLAB 腳本位於 NAGToolboxDemos/Time_series_analysis/g13ab_demo.m,也可下載 壓縮檔。
D01 函數 - 積分
在數值分析中,定積分中的一維或多維度的求值是非常普遍的。D01 函數提供了非常多種的演算法求解; 個別函數的呼叫全然依積分的形式而定。如果函數的形式可以分析出來,如被積函數包含了奇異值 (singularities),尤其是代數或對數型的樣式,那麼 d01aj 函數最為合適。 其他較為特殊的函數,例如:如果被積函數為震盪函數,可以採用 d01ak;已知點為不連續的被積函數,則使用 d01al 函數。
d01aj 函數採用的是 自適應 演算法 - 意思是它會將要積分的函數,切分成許多的子區間, 並反覆切割,直到滿足所設定的精確度條件為止 (以下程式中以 epsabs 與 epsrel 變數來指定)。
以下程式呼叫 NAG 函數求解積分
|
此程式中,d01aj 函數中所呼叫的 func 變數,指定的是 MATLAB m 檔案的函數字串名; 這個檔案必須是一個函數,將會傳回給定值的積分值。 以下是一個例子:
|
(這是下圖中所計算的被積函數)。除了近似的積分估計值外,d01aj 函數還會輸出最後子區間的誤差值。 圖 2 顯示出每一個積分子區間的結果以及其相對應的誤差值。 從這個積分中也可以看出,在函數快速變化的區域,此演算法會窄化子區間的分割;且與較大誤差有關的子區間,其區間寬度也會較小 (函數接近於 0 的地方)。
圖 2:積分求值估計
本範例的 MATLAB 腳本位於 NAGToolboxDemos/Quadrature/d01aj_demo.m, 也可下載 壓縮檔。
G03 函數 - 多變量方法
多變量資料集乃是包含許多不同 目標 所觀察到的 變數。在科學分析中有許多這樣的範例資料,NAG 程式庫中的 G03 函數可以利用這些資料集來進行分析。 舉例說明,在英國的環境科學家,想要了解在他們所觀測的,分佈在英國與歐洲大陸間的 14 個區域中,進行觀測所取樣 300 個水鼠 (Arvicola 屬) 頭顱表現的 13 個特徵中,分屬於多少種的水鼠種類。 。自歐洲取得的資料已經歸類為二大類 (terrestis 與 sapidus);科學家的任務便要來決定英國所取得的資料是屬於那一個種類的。
資料處理是以 14 個區域中所觀測的 13 個變數的平均值計算開始。這可以視為 13 維度空間中的 14 個點, 一般我們會用 主成分分析 (principal components analysis) - g03aa 函數 來分析這樣的資料。主成分分析是用來將原始資料維度簡化的一個方法;只要這些數值可以足夠表示原來的資料,那麼這些數值就可以取代原來的數值。 然而對於這個田鼠的資料而言,考量到前三個主成分只能解釋原始資料 65% 的變異,顯然是不適合的。
另一個可以應用在這個問題上的技術就是 metric scaling。第一步,便是建立一個 14 乘 14 的 相異矩陣 (dissimilarity matrix) , 其中的每個元素就是其與原來 13 維度空間的距離。g03ea 函數可用來計算此相異矩陣。以下是程式片段:
|
第二個步驟便是找出一個新的矩陣能夠表示較少維度 (本例中是 3) 的資料距離;我們使用 metric scaling 將舊的矩陣投射到新的矩陣中。 接下來的 g03fa 函數,便是用來處理 metric scaling:
|
產生的三維資料可用散佈圖顯示:
|
結果顯示在圖 3,圖中可以觀察出英國地區的資料 (黑點部分) 很接近藍點 (terrestis 種),再來才是紅點 (sapidus 種), 此意味著他們是屬於同一類的。
圖 3:田鼠資料度量尺度的散佈圖
本範例的 MATLAB 腳本位於 NAGToolboxDemos/Multivariate_methods/g03fa_demo.m, 也可下載 壓縮檔。
G05 函數 - 亂數產生器
在許多的計算領域中,亂數序列的可靠性是一件很重要的任務,例如蒙地卡羅模擬。G05 函數包含了許多不同的演算法,我們這裡說明其中的兩種演算法。
在亂數產生的領域中有兩個很明顯的區別,一個為 偽隨機 (pseudo),一個為 准隨機 (quasi)。 所謂的偽隨機為統計屬性上較趨近於 "真實" 的隨機數 - 也就是說,這些亂數是由原始的亂數處理所取得 (計數器中所經過的時間頻率等等)。 例如:在偽隨機序列中每一個連續數字間的相關性是微乎其微的。相反的,准隨機則沒有這樣的特性 - 他們會在空間中提供一個較為平均的分佈值,這樣的特性很適合應用於蒙地卡羅模擬中,我們給定序列的長度,會獲得比偽隨機更正確的估計值。
我們的例子可以更清楚的說明。以下的程式會使用 g05fa 函數產生兩個偽隨機序列:
|
以下程式中採用 g05yd 函數的 Faure 演算法,產生准隨機的二維亂數序列:
|
如果每個序列可以被解釋為二維空間中的個別點,那麼我們可用散佈圖表示 (如圖 4),其中可以很明顯的顯示出兩種不同類型的亂數產生器的差異處。 雖然,他們似乎都可以隨機的分佈在二維的空間中,但是准隨機序列以更一致的方式呈現 (技術上來說,這是因為產生序列中的每一點時,演算法是以 最大化避免 的方式避免於其它數值接近)。
圖 4:兩種不同的亂數類別
本範例的 MATLAB 腳本位於 NAGToolboxDemos/Random_number_generation/g05fa_demo.m, 也可下載 壓縮檔。