來源:北大青鳥總部 2023年02月14日 16:00
隨著云計算和物聯(lián)網(IoT)的急速發(fā)展,我們無時無刻都被時間序列數(shù)據包圍著。從經濟管理再到工程領域,時間序列數(shù)據挖掘有著廣泛應用。例如證券市場中股票的交易價格與交易量、外匯市場上的匯率、期貨和黃金的交易價格以及各種類型的指數(shù)等,這些數(shù)據都形成一個持續(xù)不斷的時間序列。利用時間序列數(shù)據挖掘,可以獲得數(shù)據中蘊含的與時間相關的有用信息,實現(xiàn)知識的提取。時間序列數(shù)據挖掘是大數(shù)據挖掘研究領域里的一個重要方向之一。
眾所周知,時間序列數(shù)據本身所具備的高維性、復雜性、動態(tài)性、高噪聲特性以及容易達到大規(guī)模的特性。因此如何輕松進行時間序列數(shù)據挖掘是具有大挑戰(zhàn)性。本文將介紹時間序列數(shù)據挖掘開源庫——MatrixProfile,并在Python的環(huán)境下使用高效簡潔的程序來完成復雜的時間序列數(shù)據挖掘。
MatrixProfile的基本原理很簡單。可以先試想一個問題,如果從時間序列數(shù)據中提取一個片段并沿著時間序列的其余部分滑動,那么它在每個新位置與時間序列片段的重疊相似的程度是什么樣子的?更具體地說,我們可以計算子序列與同一長度的每個時間序列片段之間的歐幾里德距離,從而建立所謂的時間序列片段的距離模式(distanceprofile)。
如果子序列在數(shù)據中重復自身,則將至少有一個完全匹配,并且最小歐氏距離將為零(或在存在噪聲的情況下接近于零)。如圖所示,如果提取的子序列為重復模式(RepeatedPatterns)片段,那么重復模式片段沿著整個時間序列滑動時,與自身重復片段的最小歐式距離為零(紅色部分)。從紅色曲線可以看出,相比之下,如果子序列是高度唯一的(比如它包含一個顯著的異常值),那么匹配將很差(藍色曲線中的anomaly)。然后,在時間序列中滑動每個可能的片段,建立一個距離模式的集合。
MatrixProfile主要是進行識別異常事件(或不協(xié)調“discords”)和重復模式(或模體“motifs”)。這是兩項基本的時間序列任務。其中MatrixProfile分為兩個重要組成部分:距離模式(distanceprofile)和模式索引(profileindex)。距離模式是歸一化最小歐氏距離向量。模式索引包含其第一近鄰索引。換句話說,它是其最相似子序列的位置。
MatrixProfile主要采用了用滑動窗口的算法來計算,如下圖所示。圖中的滑動窗口X2到X5在時間序列(X1,…,X12)上滑動,分別計算滑動窗口與每個子序列的點積。當計算完所有的點積(D1,2,…,D9,2)后,應用排除區(qū)域(exclusionzone)進行處理。并將最小距離存儲在MatrixProfile的距離模式中,丟棄其余的距離。其中,由于子序列是從時間序列本身提取的,因此需要設置圖中排除區(qū)域來防止無價值匹配。比如,子序列片段(X1,X2,X3,X4)與滑動窗口(X2,X3,X4,X5)相似度非常高,被視為無價值匹配或平凡匹配。
MatrixProfile庫支持三種最常用的數(shù)據科學語言Python、R和Golang。它提供易于使用的接口函數(shù)MatrixProfileAPI(MPA),這是一個用R、Python和Golang編寫的通用代碼庫。不管是對時間序列分析毫無經驗的新手還是專家都很有幫助。而且它已經被廣泛地使用,包括如何挖掘網站用戶數(shù)據、訂單量和其他關鍵業(yè)務應用之間的關系。下面使用Python來進行實戰(zhàn)訓練。
MPA由三個核心組件組成:
計算(分析數(shù)據的各個成分,例如趨勢,周期性)
發(fā)現(xiàn)(對有序數(shù)據序列的feature提取與分類、發(fā)現(xiàn)不協(xié)調序列等)
可視化(通過基本繪圖顯示結果)
這三個核心功能作為底層嵌套在具有用戶可視化的界面Analyze的模塊里面,可以使那些對MatrixProfile內部工作原理一無所知的人能夠快速地利用它來處理自己的時間序列數(shù)據。
首先需要配置MatrixProfile的安裝環(huán)境,建議使用Anaconda。Anaconda是一個用于科學計算的Python發(fā)行版,內置很多用于學計算工具Python第三方庫,非常方便使用。然后,在AnacondaPrompt終端使用下面語句來安裝MatrixProfile庫。
pipinstall matrixprofile
安裝完后,我們將使用MatrixProfile API(MPA)應用接口庫來分析如下所示的合成時間序列。
合成時間序列生成代碼如下:
import matrixprofile as mp
import numpy as np
from matplotlib import pyplot as plt
dataset =mp.datasets.load('motifs-discords-small')
window_size = 32
profile = mp.compute(dataset['data'],window_size)
profile = mp.discover.discords(profile)
# time series
mp_adjusted = np.append(profile['mp'],np.zeros(profile['w'] - 1) + np.nan)
# Create a plot
plt.plot(np.arange(len(profile['data']['ts'])),profile['data']['ts'])
從合成的時間序列數(shù)據圖中可以發(fā)現(xiàn),明顯存在模式不協(xié)調現(xiàn)象。圖中前面是規(guī)律震蕩變化的正弦曲線模式,而后面是兩種不同的模式。然而,一個直接的問題是,該如何選擇子序列長度。圖中橫坐標0-500范圍內是否只有兩個正弦模體?我們可以使用應用接口庫MPA中的analyze函數(shù)來自動處理這個問題,完整程序代碼如下。
import matrixprofile as mp
import numpy as np
from matplotlib import pyplot as plt
dataset =mp.datasets.load('motifs-discords-small')
window_size = 32
profile = mp.compute(dataset['data'],window_size)
profile = mp.discover.discords(profile)
profile, figures =mp.analyze(profile['data']['ts'])
由于沒有指定任何關于子序列長度的信息,“analyze”首先利用稱為panmatrix profile(簡稱PMP)的強大計算來生成有助于評估不同子序列長度的模式圖,如下所示。
簡而言之,它是對所有可能的子序列長度的全局計算,并壓縮為一個可視化模式圖。X軸是矩陣模式的索引,Y軸是相應的子序列長度。圖中顏色越暗,代表歐幾里德距離就越低。
這里,analyze函數(shù)將結合PMP和一個隱藏的算法,從所有可能的滑動窗口大小中選擇合理的模體和不協(xié)調。由“analyze”創(chuàng)建的附加圖形顯示前三個模體和前三個不協(xié)調,以及相應的窗口大小和在矩陣模式中的索引位置(以及擴展的時間序列)。
下圖中藍色部分代表合成時間序列數(shù)據,紅色部分代表模體,黑色部分是相似近鄰。
這里采用的是程序默認的參數(shù),運行后會自動得到很多結果。我們也可以更改滑動窗口的大小。程序會自動找出不協(xié)調的點,如下圖所示。
profile,figures = mp.analyze(profile['data']['ts'],windows=203)
比起常規(guī)的時間序列挖掘算法,MatrixProfileAPI(MPA)應用接口庫提供了一個較為簡潔的方式,能讓你更輕松地分析和挖掘時間序列數(shù)據,當然,上面只是采用了MPA內置函數(shù)默認的參數(shù)來進行說明。如果想進一步了解MPA的用法,并將其應用到自己特定的應用場景中,可以在網上查找MPA官方使用手冊。