時間序列 ACF 和 PACF 理解、程式碼、視覺化
時間序列系列的相關介紹,從零梳理時序概念、相關技術、和實戰案例,歡迎訂閱 ?時間序列專欄 跟蹤全部內容。
我們說時間序列可以被預測,主要基於以下事實:我們可以部分掌握影響該時間序列的因素的變化情況。換句話說,對時間序列進行預測,其實就是利用各種理論和工具,對觀察到的時間序列進行“抽絲剝繭”,以試圖掌握其變化的本質,從而對未來的表現進行預測。
而自相關性是時序預測的基礎,對於時序的平穩性、白噪聲檢測、確定 模型中的階數(p/q)有著重要的作用。本篇將著重介紹自相關的概念 和 。
ACF 自相關函式
概念理解
ACF(Autocorrelation Function)就是用來計算時間序列自身的相關性的函式。
對於同一時間 的計算,,這個很好理解。
如果是不同的時間,比如 ,該如何計算呢?
實際上,在應用自相關函式時,其輸入分別為原始的時間序列 及其 階滯後序列 ,於是 就變成了:
,這裡兩個序列的長度是一致的,如下圖所示:
計算和程式碼
ACF的公式定義為:
Python
程式碼實現可以直接使用statsmodels
包進行計算,當然也可以自己透過Numpy
復現一遍公式,結果是一樣的。
import numpy as np
# statsmodels包計算acf
import statsmodels.tsa.stattools as stattools
def default_acf(ts, k):
return statools.acf(ts, nlags=k, unbiased=False)
# 手擼公式計算acf,有偏
def acf(ts, k):
""" Compute autocorrelation coefficient, biased
"""
x = np.array(ts) - np.mean(ts)
coeff = np.zeros(k+1, np.float64) # to store acf
coeff[0] = x.dot(x) # N*c(0)
for i in range(1, k+1):
coeff[i] = x[:-i].dot(x[i:]) # (N-k)*c(i)
return coeff / coeff[0]
視覺化
透過視覺化可以更清楚的看出不同lag的係數值和趨勢變化,透過statsmodels
函式的直接繪製,以下是示例。
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
df = pd.read_excel('data.xlsx',engine='openpyxl')
df['price'].plot()
plot_acf(df['price'], lags=40, adjusted=False)
plt.show()
第一個圖是一組時間序列的資料。第二個圖是計算的ACF相關係數圖。
ACF圖的橫座標表示滯後的階數,縱座標表示對應的滯後序列與原始序列的相關係數。可以看出,隨著滯後階數的增加,滯後序列與原始序列的相關性也在不斷地降低。圖中的藍色區域表示置信區間,用來標識相關係數是否具有統計顯著性。簡單來說,如果相關係數落在置信區間內,表明對應的兩個序列的相關係數並不能代表其真實相關性。
即使是兩個完全不相干的白噪聲序列,由於隨機性的影響,其相關係數也不可能全都為0,因此,需要使用置信區間來過濾掉那些由於隨機性造成的“偽相關”。
PACF 偏自相關函式
概念理解
我們知道求導是對所有項都求導,求偏導只對某一個求導忽略其他項。 和 也可以理解為這樣的關係。
前面我們計算 自相關函式時,得到的並不是 與 之間單純的相關關係。因為 同時還會受到中間 個隨機變數 、... 的影響,而這 個隨機變數又都和 具有相關關係,所以自相關係數裡面實際摻雜了其他變數對 與 的影響。
為了得到 對 的直接影響,引入了偏自相關係數 的概念。滯後 偏自相關係數是指,對於平穩時間序列 ,在剔除了中間 個隨機變數 、... 的干擾之後, 對 影響的純相關程度。
計算和程式碼
的計算比 要複雜很多。這裡我們藉助AR模型來說明,對於AR(p)模型,一般會有如下假設:
其中, 是線性相關係數, 是噪聲,即我們假設點 與前 個點 是線性相關的。而 所要表示的就是點 與點 的相關性,所以,
序列的偏相關係數PACF:
有幾種方法可以求解相關係數,方法包括最小二乘法(MLS)、尤爾-沃克方程(Yule-Walker equation)、伯格演算法(Burg"s method。由於公式推導內容較多,本篇對求解方法不做詳細介紹。
Python計算程式碼如下:
import numpy as np
from scipy.linalg import toeplitz
# 使用statsmodels
import statsmodels.tsa.stattools as stattools
def default_pacf(ts, k):
return statools.pacf(ts, nlags=k, unbiased=True)
# 尤爾-沃克方程公式復現
def yule_walker(ts, order):
''' Solve yule walker equation
'''
x = np.array(ts) - np.mean(ts)
n = x.shape[0]
r = np.zeros(order+1, np.float64) # to store acf
r[0] = x.dot(x) / n # r(0)
for k in range(1, order+1):
r[k] = x[:-k].dot(x[k:]) / (n - k) # r(k)
R = toeplitz(r[:-1])
return np.linalg.solve(R, r[1:]) # solve `Rb = r` to get `b`
def pacf(ts, k):
''' Compute partial autocorrelation coefficients for given time series,unbiased
'''
res = [1.]
for i in range(1, k+1):
res.append(yule_walker(ts, i)[-1])
return np.array(res)
視覺化
使用statsmodels
函式直接繪製,methond
可以選擇合適的方法求解,下面使用最小二乘法ols進行求解。
# 使用最小二乘法ols求解
plot_pacf(df['price'], lags=40, method='ols')
plt.show()
以上就是對 和 的介紹,理解自相關的概念對於學習時間序列非常重要,下一篇將介紹它們的應用場景。
參考連結
[1].https://blog.csdn.net/SunJW_2017/article/details/126993853,芳樽裡的歌
[2].,洪於祥 [3].,gwave [4]. [5].https://mp.weixin.qq.com/s/llMZaMkhoXLRDlFxoFlXiw,seriesc
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2933593/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何用Python做輿情時間序列視覺化?Python視覺化
- 淺析“程式碼視覺化”視覺化
- 程式碼段——Newtonsoft簡單設定序列化的時間格式
- 我理解的前端視覺化前端視覺化
- 【時間序列分析】01. 時間序列·平穩序列
- 聊聊程式碼倉庫視覺化:gource 篇視覺化Go
- Matlab學習-視覺化和程式設計Matlab視覺化程式設計
- 【程式碼視覺化實踐】程式碼變更影響分析視覺化
- 資料視覺化詳解+程式碼演練視覺化
- 低程式碼 系列 —— 視覺化編輯器3視覺化
- 一份視覺化特徵圖的程式碼視覺化特徵
- 時間序列結構變化分析:Python實現時間序列變化點檢測Python
- 基於深度學習的時間序列分類[含程式碼]深度學習
- 面向研發的低程式碼、程式碼視覺化設計編排視覺化
- 時間序列分析
- python 時間序列Python
- 【SpringBoot】 中時間型別 序列化、反序列化、格式處理Spring Boot型別
- Go 中時間型別欄位的 JSON 序列化和反序列化的處理技巧Go型別JSON
- 資料視覺化--實驗五:高維非空間資料視覺化視覺化
- R語言:KEGG富集、視覺化教程,附程式碼R語言視覺化
- Tensorflow 視窗時間序列資料的處理
- 時間日期格式化程式碼例項
- js時間物件:獲取當前時間(格式化)- 程式碼篇JS物件
- 關於視覺化程式設計分類的民間智慧 – drossbucket視覺化程式設計ROS
- 時間序列分析基本思想及時間序列建模步驟
- 40行Python程式碼,實現卷積特徵視覺化Python卷積特徵視覺化
- RocketMQ 視覺化環境搭建和基礎程式碼使用MQ視覺化
- 用低程式碼平臺視覺化設計表單視覺化
- Python 時間序列分析Python
- 手把手教你用Prophet快速進行時間序列預測(附Prophet和R程式碼)
- 將VAE用於時間序列:生成時間序列的合成資料
- Linux 檢視程式啟動時間、執行時間Linux
- elastic8.4.0搜尋+logstash<->mysql實時同步+kibana視覺化操作+netcore程式碼筆記ASTMySql視覺化NetCore筆記
- 學會這個神器和技巧,低程式碼開發高階視覺化大屏視覺化
- android短視訊開發,Java程式碼獲取當前時間的時間戳AndroidJava時間戳
- 使用LSTMs和Prophet進行時間序列預測你的電子郵箱負載(附程式碼)負載
- 時間序列資料如何助力釀酒和BBQ?
- 視覺化視覺化