1. 程式人生 > >Matlab數學建模學習報告(一)

Matlab數學建模學習報告(一)

一、學習目標。

(1)瞭解Matlab與數學建模競賽的關係。

(2)掌握Matlab數學建模的第一個小例項—評估股票價值與風險。

(3)掌握Matlab數學建模的迴歸演算法。

二、例項演練。

   1、談談你對Matlab與數學建模競賽的瞭解。

        Matlab在數學建模中使用廣泛:MATLAB 是公認的最優秀的數學模型求解工具,在數學建模競賽中超過 95% 的參賽隊使用 MATLAB 作為求解工具,在國家獎隊伍中,MATLAB 的使用率幾乎 100%。雖然比較知名的數模軟體不只 MATLAB。

        人們喜歡使用Matlab去數學建模的原因:

(1)MATLAB 的數學函式全

,包含人類社會的絕大多數數學知識。

(2)MATLAB 足夠靈活,可以按照問題的需要,自主開發程式,解決問題。

(3)MATLAB易上手,本身很簡單,不存在壁壘。掌握正確的 MATLAB 使用方法和實用的小技巧,在半小時內就可以很快地變成 MATLAB 高手了。

        正確且高效的 MATLAB 程式設計理念就是以問題為中心的主動程式設計。我們傳統學習程式設計的方法是學習變數型別、語法結構、演算法以及程式設計的其他知識,因為學習時候是沒有目標的,也不知道學的知識什麼時候能用到,收效甚微。而以問題為中心的主動程式設計,則是先找到問題的解決步驟,然後在 MATLAB 中一步一步地去實現。在每步實現的過程中,遇到問題

查詢知識(網際網路時代查詢知識還是很容易的),定位方法,再根據方法,查詢 MATLAB 中的對應函式,學習函式用法,回到程式,解決問題。在這個過程中,知識的獲取都是為了解決問題的,也就是說每次學習的目標都是非常明確的,學完之後的應用就會強化對知識的理解和掌握,這樣即學即用的學習方式是效率最高,也是最有效的方式。最重要的是,這種主動的程式設計方式會讓學習者體驗到學習的成就感的樂趣,有成就感,自然就強化對程式設計的自信了。這種內心的自信和強大在建模中會發揮意想不到的力量,所為信念的力量。

         數學建模競賽中的 MATLAB 水平要求:

要想在全國大學生數學建模競賽中拿到國獎, MATLAB 技能是必備的。 具體的技能水平應達到:

1)瞭解 MATLAB 的基本用法,包括幾個常用的命令,如何獲取幫助,指令碼結構,程式的分節與註釋,矩陣的基本操作,快捷繪圖方式;

2)熟悉 MATLAB 的程式結構,程式設計模式,能自由地建立和引用函式(包括匿名函式);

3)熟悉常見模型的求解演算法和套路,包括連續模型,規劃模型,資料建模類的模型;

4)能夠用 MALTAB 程式將機理建模的過程模擬出來,就是能夠建立和求解沒有套路的數學模型。 

要想達到如上要求, 不能按照傳統的學習方式一步一步地學習, 而要結合上述提到的學習理念制定科學的訓練計劃。

  2、已知股票的交易資料:日期、開盤價、最高價、最低價、收盤價、成交量和換手率,試用某種方法來評價這隻股票的價值和風險。如何用MATLAB去求解該問題?(交易資料:點選此處獲取資料

解題步驟:

第一階段:從外部讀取資料

Step1.1:把資料檔案sz000004.xls拖曳進‘當前資料夾區’,選中資料檔案sz000004.xls,右鍵,將彈出右鍵列表,很快可發現有個“匯入資料”選單,如圖 1 所示。

                                       

                                                                  圖1. 啟動匯入資料引擎示意圖

Step1.2:單擊“匯入資料”這個按鈕,則很快發現起到一個匯入資料引擎,如圖 4 所示。

                      

                                                                    圖2. 匯入資料介面

Step1.3:觀察圖 2,在右上角有個“匯入所選內容”按鈕,則可直接單擊之。馬上我們就會發現在 MATLAB 的工作區(當前記憶體中的變數)就會顯示這些匯入的資料,並以列向量的方式表示,因為預設的資料型別就是“列向量”,當然您可以可以選擇其他的資料型別,大家不妨做幾個實驗,觀察一下選擇不同的資料型別後會結果會有什麼不同。至此,第一步獲取資料的工作的完成。

第二階段:資料探索和建模

現在重新回到問題,對於該問題,我們的目標是能夠評估股票的價值和風險,但現在我們還不知道該如何去評估,MATLAB 是工具,不能代替我們決策用何種方法來評估,但是可以輔助我們得到合適的方法,這就是資料探索部分的工作。下面我們就來嘗試如何在 MATLAB 中進行資料的探索和建模。

Step2.1:檢視資料的統計資訊,瞭解我們的資料。具體操作方式是雙擊工具區(直接雙擊這三個字),此時會得到所有變數的詳細統計資訊。通過檢視這些基本的統計資訊,有助於快速在第一層面認識我們所正在研究的資料。當然,只要大體瀏覽即可,除非這些統計資訊對某個問題都有很重要的意義。資料的統計資訊是認識資料的基礎,但不夠直觀,更直觀也更容易發現數據規律的方式就是資料視覺化,也就是以圖的形式呈現資料的資訊。下面我們將嘗試用 MATLAB 對這些資料進行視覺化。

由於變數比較多,所以還有必要對這些變數進行初步的梳理。對於這個問題,我們一般關心收盤價隨時間的變化趨勢,這樣我們就可以初步選定日期(DateNum)和收盤價(Pclose)作為重點研究物件。也就是說下一步,要對這這兩個變數進行視覺化。

對於一個新手,我們還不知道如何繪圖。但不要緊,新版 MATLAB 提供了更強大的繪圖功能——“繪圖”面板,這裡提供了非常豐富的圖形原型,如圖 3 所示。

                            

                                                                                 圖3 MATLAB繪圖面板中的圖例

要注意,需要在工作區選中變數後繪圖面板中的這些圖示才會啟用。接下來就可以選中一箇中意的圖示進行繪圖,一般都直接先選第一個(plot)看一下效果,然後再瀏覽整個面板,看看有沒有更合適的。下面我們進行繪圖操作。

Step2.2:選中變數 DataNum 和 Pclose,在繪圖面板中單機 plot 圖示,馬上可以得到這兩個變數的視覺化結果,如圖 4 所示,同時還可以在命令視窗區看到繪製此圖的命令:

>> plot(DateNum,Pclose)

                                        

                                                                                       圖4 通過 plot 圖示繪製的原圖

這樣我們就知道了,下次再繪製這樣的圖直接用 plot 命令就可以了。一般情況下,用這種方式繪圖的圖往往不能滿足我們的要求,比如我們希望更改:

(1)曲線的顏色、線寬、形狀;

(2)座標軸的線寬、座標,增加座標軸描述;

(3)在同個座標軸中繪製多條曲線。

此時我們就需要了解更多關於命令 plot 的用法,這時就可以通過 MATLAB 強大的幫助系統來幫助我們實現期望的結果。最直接獲取幫助的兩個命令是 doc 和 help,對於新手來說,推薦使用 doc,因為 doc 直接開啟的是幫助系統中的某個命令的用法說明,不僅全,而且有應用例項,這樣就可以“照貓畫虎”,直接參考例項,從而將例項快速轉化成自己需要的程式碼。

接下來我們就要考慮如何評估股票的價值和風險呢?

         對於一隻好的股票,我們希望股票的增幅越大越好,體現在數學上,就是曲線的斜率越大越好。

         對於風險,則可用最大回撤率來描述更合適,什麼是最大回撤率?

         最大回撤率的公式可以這樣表達:

D為某一天的淨值,i為某一天,j為i後的某一天,Di為第i天的產品淨值,Dj則是Di後面某一天的淨值

drawdown=max(Di-Dj)/Di,drawdown就是最大回撤率。其實就是對每一個淨值進行回撤率求值,然後找出最大的。可以使用程式實現。最大回撤率越大,說明該股票的風險越高。所以最大回撤率越小,股票越好。

           斜率和最大回撤率不妨一個一個來解決。我們先來看如何計算曲線的斜率。對於這個問題,比較簡單,由於從資料的視覺化結果來看,資料近似成線性,所以不妨用多項式擬合的方法來擬合該改組資料的方程,這樣我們就可以得到斜率。

Step2.3:通過polyfit()多項式擬合的命令,並計算股票的價值,具體程式碼為:

>> p = polyfit(DateNum,Pclose,1); % 多項式擬合

>> value = p(1) % 將斜率賦值給value,作為股票的價值

value =

    0.1212

程式碼分析:%後面的內容是註釋。polyfit()有三個引數,前兩個大家都能明白是什麼意思,那第三個引數是什麼意思呢?它表示多項式的階數,也就是最高次數。比如:在本例中,第三個引數為1,說明其為一次項,即一次函式。第三個引數為你要擬合的階數,一階直線擬合,二階拋物線擬合,並非階次越高越好,看擬合情況而定。polyfit()返回階數為 n 的多項式 p(x) 的係數,p 中的係數按降冪排列。在本例中的P(1)指的是最高項的係數,即斜率。

Step2.4:用相似的方法,可以很快得到計算最大回撤的程式碼:

>> MaxDD = maxdrawdown(Pclose); % 計算最大回撤

>> risk = MaxDD  % 將最大回撤賦值給risk,作為股票的風險

risk =

    0.1155

程式碼分析:最大回撤率當然計算的是每天收盤時的股價。最大回撤率越大,說明該股票的風險越高。所以最大回撤率越小,股票越好。

到此處,我們已經找到了評估股票價值和風險的方法,並能用 MALTAB 來實現了。但是,我們都是在命令列中實現的,並不能很方便地修改程式碼。而 MATLAB 最經典的一種用法就是指令碼,因為指令碼不僅能夠完整地呈現整個問題的解決方法,同時更便於維護、完善、執行,優點很多。所以當我們的探索和開發工作比較成熟後,通常都會將這些有用的程式歸納整理起來,形成指令碼。現在我們就來看如何快速開發解決該問題的指令碼。

Step2.5:像 Step1.1 一樣,重新選中資料檔案,右鍵並單擊“匯入資料”選單,待啟動匯入資料引擎後,選擇“生成指令碼”,然後就會得到匯入資料的指令碼,並儲存該指令碼。

指令碼原始碼中有些地方要注意:

       %%在matlab程式碼中的作用是將程式碼分塊,上下兩個%%之間的部分作為一塊,在執行程式碼的時候可以分塊執行,檢視每一塊程式碼的執行情況。常用於除錯程式。%%相當於jupyter notebook中的cell。

       %後的內容是註釋。

        每句程式碼後面的分號作用為不在命令視窗顯示執行結果。

指令碼原始碼:

%% 預測股票的價值與風險

%% 匯入資料
clc, clear, close all
% clc:清除命令視窗的內容,對工作環境中的全部變數無任何影響 
% clear:清除工作空間的所有變數 
% close all:關閉所有的Figure視窗

% 匯入資料
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');
% [num,txt,raw],~表示省略該部分的返回值
% xlsread('filename','sheet', 'range'),第二個引數指資料在sheet1還是其他sheet部分,range表示單元格範圍

% 建立輸出變數
data = reshape([raw{:}],size(raw));
% [raw{:}]指raw裡的所有資料,size(raw):6 x 8 ,該語句把6x8的cell型別資料轉換為6x8 double型別資料

% 將匯入的陣列分配列變數名稱
Date = data(:, 1); % 第一個引數表示從第一行到最後一行,第二個引數表示第一列
DateNum = data(:, 2);
Popen = data(:, 3);
Phigh = data(:, 4);
Plow = data(:, 5);
Pclose = data(:, 6);  
Volum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股數*成交價格 再加權求和
Turn = data(:, 8); % turn表示股票週轉率,股票週轉率越高,意味著該股股性越活潑,也就是投資人所謂的熱門股

% 清除臨時變數data和raw
clearvars data raw;

%% 資料探索

figure % 建立一個新的影象視窗
plot(DateNum, Pclose, 'k'); % 'k',曲線是黑色的,列印後不失真
datetick('x','mm-dd'); % 更改日期顯示型別。引數x表示x軸,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27
xlabel('日期') % x軸
ylabel('收盤價') % y軸
figure
bar(Pclose) % 作為對照圖形

%% 股票價值的評估

p = polyfit(DateNum, Pclose, 1); % 多項式擬合
% polyfit()返回階數為 n 的多項式 p(x) 的係數,p 中的係數按降冪排列
P1 = polyval(p,DateNum); % 得到多項式模型的結果
figure
plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型與原始資料的對照, '*g'表示綠色的*
value = p(1) % 將斜率賦值給value,作為股票的價值。p(1)最高項的次數

%% 股票風險的評估
MaxDD = maxdrawdown(Pclose); % 計算最大回撤
risk = MaxDD  % 將最大回撤賦值給risk,作為股票的風險

  3、迴歸演算法演練。

(1)一元線性迴歸

[ 例1 ] 近 10 年來,某市社會商品零售總額與職工工資總額(單位:億元)的資料見表1,請建立社會商品零售總額與職工工資總額資料的迴歸模型。

                  

該問題是典型的一元迴歸問題,但先要確定是線性還是非線性,然後就可以利用對應的迴歸方法建立他們之間的迴歸模型了,具體實現的 MATLAB 程式碼如下:

(1)輸入資料

%% 輸入資料
clc, clear, close all
% 職工工資總額
x = [23.8,27.6,31.6,32.4,33.7,34.90,43.2,52.8,63.8,73.4];
% 商品零售總額
y = [41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];

(2)採用最小二乘迴歸

%% 採用最小二乘法迴歸
% 作散點圖
figure
plot(x,y,'r*') % 散點圖,散點為紅色
xlabel('x(職工工資總額)','fontsize',12)
ylabel('y(商品零售總額)','fontsize',12)
set(gca, 'linewidth',2) % 座標軸線寬為2

% 採用最小二乘法擬合
Lxx = sum((x-mean(x)).^2); %在列表運算中,^與.^不同
Lxy = sum((x-mean(x)).*(y-mean(y)));
b1 = Lxy/Lxx;
b0 = mean(y) - b1 * mean(x);
y1 = b1 * x + b0;

hold on % hold on是當前軸及影象保持而不被重新整理,準備接受此後將繪製的圖形,多圖共存
plot(x,y1, 'linewidth',2);

執行本節程式,會得到如圖5所示的迴歸圖形。在用最小二乘迴歸之前,先繪製了資料的散點圖,這樣就可以從圖形上判斷這些資料是否近似成線性關係。當發現它們的確近似在一條線上後,再用線性迴歸的方法進行迴歸,這樣也更符合我們分析資料的一般思路。

                         

                                                                                                    圖5

(3)採用 LinearModel.fit 函式進行線性迴歸

%% 採用 LinearModel.fit 函式進行線性迴歸
m2 = LinearModel.fit(x, y)

執行結果如下:

m2 =

Linear regression model:

    y ~ 1 + x1
Estimated Coefficients:

               Estimate      SE       tStat       pValue 

    (Intercept)    -23.549      5.1028    -4.615     0.0017215

    x1           2.7991     0.11456    24.435    8.4014e-09

R-squared: 0.987,  Adjusted R-Squared 0.985

F-statistic vs. constant model: 597, p-value = 8.4e-09

如下圖,我們只需記住-23.594是一次函式的中x的係數,2.7991是一次函式中的常數項即可,其它的不用理會。

4)採用 regress 函式進行迴歸

%% 採用 regress 函式進行迴歸
Y = y'
X = [ones(size(x,2),1),x']
[b,bint,r,rint,s] = regress(Y,X)

執行結果如下:

b =

  -23.5493

    2.7991

我們只需記住-23.594是一次函式的中x的係數,2.7991是一次函式中的常數項即可,其它的不用理會。

(2)一元非線性迴歸

[ 例2 ] 為了解百貨商店銷售額 x 與流通率(這是反映商業活動的一個質量指標,指每元商品流轉額所分攤的流通費用)y 之間的關係,收集了九個商店的有關資料(見表2)。請建立它們關係的數學模型。

                          

                                   

        為了得到 x 與 y 之間的關係,先繪製出它們之間的散點圖,如圖 2 所示的“雪花”點圖。由該圖可以判斷它們之間的關係近似為對數關係或指數關係,為此可以利用這兩種函式形式進行非線性擬合,具體實現步驟及每個步驟的結果如下:

(1)輸入資料

%% 輸入資料
clc, clear all, close all
x = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
y = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
plot(x, y, '*', 'linewidth', 1) % 這裡的linewidth指的是散點大小
set(gca,'linewidth',2) % 設定座標軸的線寬為2
xlabel('銷售額x/萬元','fontsize',12)
ylabel('流通率y/%','fontsize',12)

(2)對數形式非線性迴歸

%% 對數形式非線性迴歸
m1 = @(b,x) b(1) + b(2)*log(x);
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
b = nonlinfit1.Coefficients.Estimate;
Y1 = b(1,1) + b(2,1)*log(x);
hold on 
plot(x, Y1, '--k', 'linewidth',2)

執行結果如下:

nonlinfit1 =

Nonlinear regression model:

    y ~ b1 + b2*log(x)

Estimated Coefficients:

          Estimate      SE        tStat       pValue 

    b1    7.3979      0.26667     27.742    2.0303e-08

    b2    -1.713      0.10724    -15.974    9.1465e-07

R-Squared: 0.973,  Adjusted R-Squared 0.969

F-statistic vs. constant model: 255, p-value = 9.15e-07

(3)指數形式非線性迴歸

%% 指數形式非線性迴歸
m2 = 'y ~ b1*x^b2';
nonlinfit2 = fitnlm(x,y,m2, [1;1])
b1 = nonlinfit2.Coefficients.Estimate(1,1);
b2 = nonlinfit2.Coefficients.Estimate(2,1)
Y2 = b1*x.^b2;
hold on;
plot(x,Y2,'r','linewidth',2)
legend('原始資料','a+b*lnx','a*x^b') % 圖例

執行結果如下:

nonlinfit2 =

Nonlinear regression model:

    y ~ b1*x^b2

Estimated Coefficients:

          Estimate       SE        tStat       pValue 

    b1      8.4112     0.19176     43.862    8.3606e-10

    b2    -0.41893    0.012382    -33.834    5.1061e-09

R-Squared: 0.993,  Adjusted R-Squared 0.992

F-statistic vs. zero model: 3.05e+03, p-value = 5.1e-11

在該案例中,選擇兩種函式形式進行非線性迴歸,從迴歸結果來看,對數形式的決定係數為 0.973 ,而指數形式的為 0.993 ,優於前者,所以可以認為指數形式的函式形式更符合 y 與 x 之間的關係,這樣就可以確定他們之間的函式關係形式了。

2.多元迴歸

1.多元線性迴歸

[ 例3 ] 某科學基金會希望估計從事某研究的學者的年薪 Y 與他們的研究成果(論文、著作等)的質量指標 X1、從事研究工作的時間 X2、能成功獲得資助的指標 X3 之間的關係,為此按一定的實驗設計方法調查了 24 位研究學者,得到如表3 所示的資料( i 為學者序號),試建立 Y 與 X1 , X2 , X3 之間關係的數學模型,並得出有關結論和作統計分析。

                              

該問題是典型的多元迴歸問題,但能否應用多元線性迴歸,最好先通過資料視覺化判斷他們之間的變化趨勢,如果近似滿足線性關係,則可以執行利用多元線性迴歸方法對該問題進行迴歸。具體步驟如下:

(1)作出因變數 Y 與各自變數的樣本散點圖

作散點圖的目的主要是觀察因變數 Y 與各自變數間是否有比較好的線性關係,以便選擇恰當的數學模型形式。圖3 分別為年薪 Y 與成果質量指標 X1、研究工作時間 X2、獲得資助的指標 X3 之間的散點圖。從圖中可以看出這些點大致分佈在一條直線旁邊,因此,有比較好的線性關係,可以採用線性迴歸。繪製圖3的程式碼如下:

%% 作出因變數Y與各自變數的樣本散點圖
% x1,x2,x3,Y的資料
x1=[3.5 5.3 5.1 5.8 4.2 6.0 6.8 5.5 3.1 7.2 4.5 4.9 8.0 6.5 6.5 3.7 6.2 7.0 4.0 4.5 5.9 5.6 4.8 3.9];
x2=[9 20 18 33 31 13 25 30 5 47 25 11 23 35 39 21 7 40 35 23 33 27 34 15];
x3=[6.1 6.4 7.4 6.7 7.5 5.9 6.0 4.0 5.8 8.3 5.0 6.4 7.6 7.0 5.0 4.0 5.5 7.0 6.0 3.5 4.9 4.3 8.0 5.0];
Y=[33.2 40.3 38.7 46.8 41.4 37.5 39.0 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48.0 38.0 35.9 40.4 36.8 45.2 35.1];
% 繪圖,三幅圖橫向並排
subplot(1,3,1),plot(x1,Y,'g*')
subplot(1,3,2),plot(x2,Y,'k+')
subplot(1,3,3),plot(x3,Y,'ro')

繪製的圖形如下:

                                          

(2)進行多元線性迴歸

這裡可以直接使用 regress 函式執行多元線性迴歸,注意以下程式碼模板,以後碰到多元線性問題直接套用程式碼,具體程式碼如下:

%% 進行多元線性迴歸
n = 24; m = 3; % 每個變數均有24個數據,共有3個變數
X = [ones(n,1),x1',x2',x3'];
[b,bint,r,rint,s]=regress(Y',X,0.05) % 0.05為預定顯著水平,判斷因變數y與自變數之間是否具有顯著的線性相關關係需要用到。

執行結果如下:

b =

   18.0157
    1.0817
    0.3212
    1.2835


bint =

   13.9052   22.1262
    0.3900    1.7733
    0.2440    0.3984
    0.6691    1.8979


r =

    0.6781
    1.9129
   -0.1119
    3.3114
   -0.7424
    1.2459
   -2.1022
    1.9650
   -0.3193
    1.3466
    0.8691
   -3.2637
   -0.5115
   -1.1733
   -1.4910
   -0.2972
    0.1702
    0.5799
   -3.2856
    1.1368
   -0.8864
   -1.4646
    0.8032
    1.6301


rint =

   -2.7017    4.0580
   -1.6203    5.4461
   -3.6190    3.3951
    0.0498    6.5729
   -4.0560    2.5712
   -2.1800    4.6717
   -5.4947    1.2902
   -1.3231    5.2531
   -3.5894    2.9507
   -1.7678    4.4609
   -2.7146    4.4529
   -6.4090   -0.1183
   -3.6088    2.5859
   -4.7040    2.3575
   -4.8249    1.8429
   -3.7129    3.1185
   -3.0504    3.3907
   -2.8855    4.0453
   -6.2644   -0.3067
   -2.1893    4.4630
   -4.4002    2.6273
   -4.8991    1.9699
   -2.4872    4.0937
   -1.8351    5.0954


s =

    0.9106   67.9195    0.0000    3.0719

看到如此長的執行結果,我們不要害怕,因為裡面很多資料是沒用的,我們只需提取有用的資料。

在執行結果中,很多資料我們不需理會,我們真正需要用到的資料如下:

b =

   18.0157
    1.0817
    0.3212
    1.2835

s =

    0.9106   67.9195    0.0000    3.0719

迴歸係數 b = (β0,β1,β2,β3) = (18.0157, 1.0817, 0.3212, 1.2835),迴歸係數的置信區間,以及統計變數 stats(它包含四個檢驗統計量:相關係數的平方R^2,假設檢驗統計量 F,與 F 對應的概率 p,s^2 的值)。觀察表4的資料,會發現它來源於執行結果中的b和s:

                            

根據β0,β1,β2,β3,我們初步得出迴歸方程為:

如何判斷該回歸方程是否符合該模型呢?有以下3種方法:

1)相關係數 R 的評價:本例 R 的絕對值為 0.9542 ,表明線性相關性較強。

2)F 檢驗法:當 F > F1-α(m,n-m-1) ,即認為因變數 y 與自變數 x1,x2,...,xm 之間有顯著的線性相關關係;否則認為因變數 y 與自變數 x1,x2,...,xm 之間線性相關關係不顯著。本例 F=67.919 > F1-0.05( 3,20 ) = 3.10。

3)p 值檢驗:若 p < α(α 為預定顯著水平),則說明因變數 y 與自變數 x1,x2,...,xm之間顯著地有線性相關關係。本例輸出結果,p<0.0001,顯然滿足 p<α=0.05。

以上三種統計推斷方法推斷的結果是一致的,說明因變數 y 與自變數之間顯著地有線性相關關係,所得線性迴歸模型可用。s^2 當然越小越好,這主要在模型改進時作為參考。

3. 逐步迴歸

[ 例4 ] (Hald,1960)Hald 資料是關於水泥生產的資料。某種水泥在凝固時放出的熱量 Y(單位:卡/克)與水泥中 4 種化學成品所佔的百分比有關:

                                                                         

在生產中測得 12 組資料,見表5,試建立 Y 關於這些因子的“最優”迴歸方程。

                         

對於例 4 中的問題,可以使用多元線性迴歸、多元多項式迴歸,但也可以考慮使用逐步迴歸。從逐步迴歸的原理來看,逐步迴歸是以上兩種迴歸方法的結合,可以自動使得方程的因子設定最合理。對於該問題,逐步迴歸的程式碼如下:

%% 逐步迴歸
X=[7,26,6,60;1,29,15,52;11,56,8,20;11,31,8,47;7,52,6,33;11,55,9,22;3,71,17,6;1,31,22,44;2,54,18,22;21,47,4,26;1,40,23,34;11,66,9,12];   %自變數資料
Y=[78.5,74.3,104.3,87.6,95.9,109.2,102.7,72.5,93.1,115.9,83.8,113.3];  %因變數資料
stepwise(X,Y,[1,2,3,4],0.05,0.10)% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中

程式執行後得到下列逐步迴歸的視窗,如圖 4 所示。

                                                                                                             圖4

在圖 4 中,用藍色行顯示變數 X1、X2、X3、X4 均保留在模型中,視窗的右側按鈕上方提示:將變數X4剔除迴歸方程(Move X4 out),單擊 Next Step 按鈕,即進行下一步運算,將第 4 列資料對應的變數 X4 剔除迴歸方程。單擊 Next Step 按鈕後,剔除的變數 X3 所對應的行用紅色表示,同時又得到提示:將變數 X3 剔除迴歸方程(Move X3 out),單擊 Next Step 按鈕,這樣一直重複操作,直到 “Next Step” 按鈕變灰,表明逐步迴歸結束,此時得到的模型即為逐步迴歸最終的結果。最終結果如下:

4. 邏輯迴歸

[ 例5 ] 企業到金融商業機構貸款,金融商業機構需要對企業進行評估。評估結果為 0 , 1 兩種形式,0 表示企業兩年後破產,將拒絕貸款,而 1 表示企業 2 年後具備還款能力,可以貸款。在表 6 中,已知前 20 家企業的三項評價指標值和評估結果,試建立模型對其他 5 家企業(企業 21-25)進行評估。

                      

對於該問題,很明顯可以用 Logistic 模型來回歸,具體求解程式如下:

% logistic迴歸

%% 匯入資料
clc,clear,close all
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企業的三項評價指標值,即迴歸模型的輸入
Y0 = xlsread('logistic_ex1.xlsx','D2:D21'); % 前20家企業的評估結果,即迴歸模型的輸出
X1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 預測資料輸入

%% 邏輯函式
GM = fitglm(X0,Y0,'Distribution','binomial');
Y1 = predict(GM,X1);

%% 模型的評估
N0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]
plot(N0',Y0,'-kd'); % N0'指的是對N0'進行轉置,N0'和Y0的形式相同,該行程式碼繪製的是前20家企業的評估結果
% plot()中的引數'-kd'的解析:-代表直線,k代表黑色,d代表菱形符號
hold on;
scatter(N1',Y1,'b'); % N1'指的是對N1'進行轉置,N1'和Y1的形式相同
xlabel('企業編號');
ylabel('輸出值');

得到的迴歸結果與原始資料的比較如圖5所示。

                                                                   圖5

三、總結與感悟。 

        總結:通過這次學習,我瞭解到Matlab在數學建模競賽中使用廣泛;在評估股票價值與風險的小例項中,我掌握了用Matlab去建模的基本方法和步驟;在迴歸演算法的學習過程中,我掌握了一元線性迴歸、一元非線性迴歸、多元線性迴歸、逐步迴歸、邏輯迴歸的演算法。

        感悟:正確且高效的 MATLAB 程式設計理念就是以問題為中心的主動程式設計。我們傳統學習程式設計的方法是學習變數型別、語法結構、演算法以及程式設計的其他知識,因為學習時候是沒有目標的,也不知道學的知識什麼時候能用到,收效甚微。而以問題為中心的主動程式設計,則是先找到問題的解決步驟,然後在 MATLAB 中一步一步地去實現。在每步實現的過程中,遇到問題查詢知識(網際網路時代查詢知識還是很容易的),定位方法,再根據方法,查詢 MATLAB 中的對應函式,學習函式用法,回到程式,解決問題。在這個過程中,知識的獲取都是為了解決問題的,也就是說每次學習的目標都是非常明確的,學完之後的應用就會強化對知識的理解和掌握,這樣即學即用的學習方式是效率最高,也是最有效的方式。最重要的是,這種主動的程式設計方式會讓學習者體驗到學習的成就感的樂趣,有成就感,自然就強化對程式設計的自信了。這種內心的自信和強大在建模中會發揮意想不到的力量,所為信念的力量。