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