數學建模 —— 自迴歸模型

一、自迴歸模型的定義

  將預測對象按照時間順序排列起來,構成一個所謂的時間序列,從所構成的一組時間序列的變化規律,推斷今後變化的可能性及變化趨勢、變化規律,就是時間序列預測法
  時間序列模型其實也是一種迴歸模型,其基於的原理是,一方面承認事物發展的延續性,運用過去時間序列的數據統計分析就能推測事物的發展趨勢;另一方面又充分考慮到偶然因素影響而產生的隨機性,爲了消除隨機波動的影響,利用歷史數據,進行統計分析,並對數據進行適合的處理,進行趨勢預測
  自迴歸模型是用自身做迴歸變量的過程,即利用前期若干時刻的隨機變量的線性組合來描述以後某時刻隨機變量的線性迴歸模型,它是時間序列中的一個常見形式。

二、自迴歸模型的表現形式

  考慮一個時間序列的 y1,y2,…,yn,p 階自迴歸模型(簡稱爲AR§)表明序列中yt是前 p 個序列的線性組合及誤差項的函數,一般形式的數據模型爲:
yt=Φ0+Φ1yt1+Φ2yt2++Φpytp+εt y_t = Φ_0+Φ_1y_{t-1}+Φ_2y_{t-2}+…+Φ_py_{t-p}+ε_t
其中,Φ0是常數項,Φ1,…,Φp 是模型參數,εt是具備均值爲 0,方差爲 σ 的白噪聲(白噪聲是指功率譜密度在整個頻域內均勻分佈的噪聲)。

三、Matlab_AR模型階數確定

  有幾種方法來確定。如 Shin 提出基於 SVD的方法,而 AIC和 FPE方法是目前應用最廣 泛的方法。 若計算出的 AIC較小,例如小於 -20,則該誤差可能對應於損失函數的 10-10級別, 則這時階次可以看成是系統合適的階次。

四、matlab 相關性分析

Pearson相關係數

  考察兩個事物(在數據裏我們稱之爲變量)之間的相關程度,簡單來說就是衡量兩個數據集合是否在一條線上面。其計算公式爲:
在這裏插入圖片描述
N表示變量取值的個數。
相關係數r的值介於–1與+1之間,即–1≤r≤+1。其性質如下:

  1. 當r>0時,表示兩變量正相關,r<0時,兩變量爲負相關。
  2. 當|r|=1時,表示兩變量爲完全線性相關,即爲函數關係。
  3. 當r=0時,表示兩變量間無線性相關關係。
  4. 當0<|r|<1時,表示兩變量存在一定程度的線性相關。且|r|越接近1,兩變量間線性關係越密切;|r|越接近於0,表示兩變量的線性相關越弱。

一般可按三級劃分:
  |r|<0.4爲低度線性相關;0.4≤|r|<0.7爲顯著性相關;0.7≤|r|<1爲高度線性相關。

當兩個變量的標準差都不爲零時,相關係數纔有定義,皮爾遜相關係數適用於:

  1. 兩個變量之間是線性關係,都是連續數據。
  2. 兩個變量的總體是正態分佈,或接近正態的單峯分佈。
  3. 兩個變量的觀測值是成對的,每對觀測值之間相互獨立。

Matlab 實現:

	x=[1;2;3];
	y=[2;5;6];
	r1=corr(x,y,'type','pearson');
	r2=corrcoef(x,y);

結果:

	r1=0.9608
	
	r2=
	
	1.0000 0.9608
	
	0.9608 1.0000

Spearman相關係數

  斯皮爾曼相關係數用來估計兩個變量X、Y之間的相關性,其中變量間的相關性可以使用單調函數來描述。如果兩個變量取值的兩個集合中均不存在相同的兩個元素,那麼,當其中一個變量可以表示爲另一個變量的很好的單調函數時(即兩個變量的變化趨勢相同),兩個變量之間的相關係數可以達到+1或-1。

  斯皮爾曼相關係數對數據條件的要求沒有皮爾遜相關係數嚴格,只要兩個變量的觀測值是成對的,或者是由連續變量觀測資料轉化得到的,不論兩個變量的總體分佈形態、樣本容量的大小如何,都可以用斯皮爾曼相關係數來進行研究。

  使用matlab計算spearman相關係數則比較簡單,也是使用corr函數,如下:

	r= corr(x, y, 'type' , 'Spearman');  

注意:使用Matlab自帶函數計算斯皮爾曼相關係數時,需要保證X、Y均爲列向量;
  求解時間序列的相關係數
在這裏插入圖片描述
Python 繪製相關係數熱力圖

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import pearsonr, spearmanr

def dataPlot():
    data1 = [[1,0.3260,0.7916,0.8073],[0.3260,1,0.2162,0.1426],[0.7916,0.2162,1,0.6745],[0.8073,0.1426,0.6945,1]]
    data1 = np.array(data1)
    fig, ax = plt.subplots(figsize=(10, 10))
    key_list = ['A', 'B', 'C', 'D']
    sns.heatmap(pd.DataFrame(np.round(data1, 4), columns=key_list, index=key_list), annot=True, vmax=4, vmin=0,
                xticklabels=True,
                yticklabels=True, square=True, cmap="YlGnBu")
    ax.set_title(' Heat Map ', fontsize=18)
    ax.set_ylabel('Y', fontsize=18)
    ax.set_xlabel('X', fontsize=18)

    plt.savefig('data1.png')
    plt.show()

if __name__ == '__main__':
    dataPlot()

繪製的圖像:
在這裏插入圖片描述

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