專利名稱:基于相同結(jié)點鏈和哈希鏈的事件序列頻繁情節(jié)挖掘方法
技術(shù)領(lǐng)域:
本發(fā)明屬于時態(tài)數(shù)據(jù)挖掘技術(shù),具體涉及一種基于相同結(jié)點鏈和哈希鏈的事件序 列頻繁情節(jié)挖掘的方法及系統(tǒng)。
背景技術(shù):
隨著傳感器和無線射頻識別(feidio Frequency Identification, RFID)等電子數(shù) 據(jù)采集設(shè)備(Electronic Data Gathering Equipment, EDGE)在供應(yīng)鏈管理、環(huán)境監(jiān)控及 物聯(lián)網(wǎng)等諸多領(lǐng)域中被廣泛使用,產(chǎn)生了大量的事件類型的數(shù)據(jù),復(fù)雜事件處理(Complex Event Processing, CEP)技術(shù)越來越受到關(guān)注和重視,逐漸成為數(shù)據(jù)庫領(lǐng)域繼數(shù)據(jù)流之后 新的研究熱點。頻繁情節(jié)挖掘是CEP的重要研究內(nèi)容,其方法和技術(shù)可以應(yīng)用在很多方面, 如網(wǎng)絡(luò)入侵檢測、財政事件和股票趨勢分析、電信網(wǎng)絡(luò)報警和物聯(lián)網(wǎng)等,通過挖掘事件序列 中的頻繁情節(jié),可以建立相應(yīng)的關(guān)聯(lián)規(guī)則,從而挖掘出隱藏在事件數(shù)據(jù)中的有價值的信息。 例如,在物聯(lián)網(wǎng)的各種監(jiān)控應(yīng)用中,由傳感器和RFID設(shè)備可以產(chǎn)生大量的監(jiān)控數(shù)據(jù),這些 監(jiān)控數(shù)據(jù)形成一個事件序列。序列中的事件并不是獨立的,在某些時間點發(fā)生的事件可能 與另一些時間點上事件的發(fā)生有著必然的聯(lián)系,也就是說,在事件序列中存在關(guān)聯(lián)規(guī)則。我 們可以通過挖掘事件序列中的頻繁情節(jié)產(chǎn)生這些規(guī)則,從而掌握隱藏在事件序列中的事件 關(guān)聯(lián)關(guān)系及事件發(fā)生的規(guī)律。CEP 43 ^^ ^ (eventtype, time, location, attr1 attr2, . . . , attrn)的 數(shù)據(jù)模式,其中,eventtype是事件類型名,time是事件發(fā)生的時間戳,location是事件發(fā) 生的地點,具體體現(xiàn)為檢測出事件的傳感器或RFID閱讀器的編號,Bttr1, attr2, ... , attrn 是若干事件屬性。事件按照time域升序構(gòu)成事件序列。所謂情節(jié)是事件序列上發(fā)生的事 件的偏序集合。從以上定義可以看出,事件序列上的頻繁情節(jié)挖掘不同于事務(wù)數(shù)據(jù)庫上的 頻繁模式挖掘,后者實際上是對頻繁項集的挖掘,不需要考慮一個模式內(nèi)部各項之間的先 后順序,而事件序列中的事件具有很強的時態(tài)特性,相同事件集合中的事件以不同的順序 發(fā)生將構(gòu)成不同的情節(jié),因此,情節(jié)挖掘必須考慮情節(jié)內(nèi)部各事件發(fā)生的順序;頻繁情節(jié)挖 掘也不同于序列模式挖掘,二者雖然都是對事件類型的數(shù)據(jù)進行處理,但前者是在單一的 事件序列上進行挖掘,而后者是在一組事件序列上進行挖掘。因此,現(xiàn)有的頻繁模式和序列 模式挖掘方法不能用于頻繁情節(jié)挖掘。通常,頻繁情節(jié)按照產(chǎn)生的方式分成兩大類,一類是基于窗口的頻繁情節(jié);另一類 是最小發(fā)生的頻繁情節(jié)。挖掘基于窗口的頻繁情節(jié)對于建立情節(jié)規(guī)則存在以下問題(1) 一個情節(jié)在一個窗口內(nèi)的幾次發(fā)生只被計數(shù)一次;( 一個情節(jié)的一次有效發(fā)生由于被包 含在不同的窗口中而被計數(shù)多次。這些問題不利于建立情節(jié)規(guī)則。挖掘最小發(fā)生的頻繁情 節(jié)考慮情節(jié)的實際發(fā)生次數(shù)而不是包含情節(jié)的窗口的個數(shù),有利于建立相應(yīng)的情節(jié)規(guī)則; 此外,挖掘最小發(fā)生的頻繁情節(jié)關(guān)注最晚開始、最早結(jié)束的情節(jié)發(fā)生(即最小發(fā)生),基于 最小發(fā)生的頻繁情節(jié)建立規(guī)則,有助于對未來事件做出最早的預(yù)測。本發(fā)明對最小發(fā)生的 頻繁情節(jié)進行挖掘。
5
就挖掘方法而言,現(xiàn)有的情節(jié)挖掘主要采用類Apriori方法。Apriori算法是用來 在事務(wù)數(shù)據(jù)庫或數(shù)據(jù)流上挖掘頻繁模式的經(jīng)典算法。事件序列上的類Apriori情節(jié)挖掘方 法在考慮事件數(shù)據(jù)特點的同時,借鑒了 Apriori算法的挖掘思想,它們保留了 Apriori算法 的特點,需要經(jīng)過由低階頻繁情節(jié)產(chǎn)生高階候選情節(jié)集合,再通過對候選情節(jié)進行評價產(chǎn) 生高階頻繁情節(jié)的反復(fù)迭代過程,反復(fù)進行這樣的迭代過程非常耗時,且生成的各階候選 情節(jié)需占用大量的內(nèi)存空間,導(dǎo)致挖掘的時間和空間性能較差;而且,該類方法由于需要對 數(shù)據(jù)進行多次掃描,只能局限于對靜態(tài)數(shù)據(jù)進行處理,不能被擴展到事件流上進行挖掘。
發(fā)明內(nèi)容
針對現(xiàn)有挖掘方法存在的問題,對于事件序列上最小發(fā)生的頻繁情節(jié),本發(fā)明提 供了一種基于相同結(jié)點鏈和哈希鏈的事件序列頻繁情節(jié)挖掘方法。本發(fā)明提出的事件序列上挖掘最小發(fā)生頻繁情節(jié)的方法,通過對低階頻繁情節(jié)進 行基于相同結(jié)點鏈和哈希鏈的逐級延伸直接生成高階頻繁情節(jié)。本發(fā)明提供的發(fā)現(xiàn)情節(jié)的 最小發(fā)生并對其進行計數(shù)的方法,通過建立情節(jié)矩陣并在矩陣元素上設(shè)置相應(yīng)的修改狀態(tài) 發(fā)現(xiàn)2-情節(jié)的最小發(fā)生并實現(xiàn)計數(shù),通過對頻繁的2-情節(jié)進行基于時間戳隊列的延伸來 發(fā)現(xiàn)k-情節(jié)(k> 2)的最小發(fā)生并實現(xiàn)計數(shù)。本發(fā)明提供的基于相同結(jié)點鏈和哈希鏈的頻繁情節(jié)挖掘方法,其步驟包括(1)對相關(guān)數(shù)據(jù)結(jié)構(gòu)進行初始化。具體包括將事件序列中包含的事件類型按照 自然數(shù)遞增的順序進行編碼;對包含1-情節(jié)信息的結(jié)構(gòu)數(shù)組印1_1以及包含2-情節(jié)信息 的情節(jié)矩陣進行初始化;(2)判斷事件序列是否已掃描完,若已掃描完,則轉(zhuǎn)入步驟(6);否則進入步驟 ⑶;(3)在事件序列上讀取掃描事件(e,t);(4)將事件e的發(fā)生計數(shù)加1,發(fā)生的時間戳t記錄在相應(yīng)的印1_1數(shù)組元素中;(5)調(diào)用函數(shù)GenMinOcc (e,t),生成與事件(e,t)相關(guān)的2_情節(jié)的最小發(fā)生信息 并記錄在情節(jié)矩陣中,轉(zhuǎn)入步驟O);(6)在數(shù)組epi_l中選擇頻繁的1-情節(jié),并將其按照發(fā)生計數(shù)降序排列,形成事件 隊列queue ;(7) queue隊列索引j賦值為1 ;(8)在樹中建立根的子結(jié)點ce,取queueU]的相關(guān)信息賦值給ce的相關(guān)數(shù)據(jù)域, 并將ce賦值給fe作為進一步延伸的父結(jié)點;(9)子結(jié)點編號i賦值為1 ;(10)如果fe已延伸完畢,建立了所有的子結(jié)點,即i >n(n為事件序列中包含的 事件類型的數(shù)量),則轉(zhuǎn)入步驟(18);否則進入步驟(11);(11)判斷2-情節(jié)ei_fe. name是否頻繁,若頻繁,則進入步驟(12);否則,轉(zhuǎn)入步 驟(17);(12)在樹中建立fe的子結(jié)點ce,并將2_情節(jié)ei-fe. name的相關(guān)信息賦值給ce 的相關(guān)數(shù)據(jù)域;(13)對ce的時間戳隊列進行編碼;
設(shè)時間戳隊列tq =(、,、,...,tq),則其編碼tqcode為tqcode = hash{tq) = mod((^ ^.)/100) (14)調(diào)用函數(shù)GenModLinkke)建立或修改ce的相同結(jié)點鏈和哈希鏈;(15)若函數(shù)GenModLinkke)的返回值為1,則表示ce的相同結(jié)點鏈已經(jīng)存在,ce 無需進一步延伸生成它的子結(jié)點,則轉(zhuǎn)入步驟(17);否則,表示尚不存在ce的相同結(jié)點鏈, 則進入步驟(16);(16)對ce做進一步延伸,將ce賦值給fe作為父結(jié)點,并調(diào)用子過程 GenChild(fe)生成fe的子結(jié)點;(17)子結(jié)點編號i加1,轉(zhuǎn)入步驟(10);(18)判斷事件隊列queue是否已取到尾,若已取到尾,則轉(zhuǎn)入步驟Q0);否則,進 入步驟(19);(19) queue隊列索引j加1,轉(zhuǎn)入步驟⑶;(20)根據(jù)情節(jié)樹中存儲的情節(jié)語義進行情節(jié)輸出,編碼后頻繁情節(jié)樹的存儲結(jié)構(gòu) 如圖6所示。本發(fā)明通過對低階頻繁情節(jié)進行基于相同結(jié)點鏈和哈希鏈的逐級延伸,直接生成 全部的頻繁情節(jié),在此過程中,只需掃描數(shù)據(jù)一次,無需生成候選情節(jié)集合,顯著提高了情 節(jié)挖掘的時間和空間性能,并可用于事件流上的情節(jié)挖掘。通過建立相同結(jié)點鏈和哈希鏈, 該方法具有時間成本不隨頻繁數(shù)閾值明顯變化的良好特性。
圖1是本發(fā)明方法的總流程圖;圖2是子過程GenMinOcc生成2_情節(jié)的最小發(fā)生信息的流程圖;圖3是函數(shù)GenModLink建立或修改相同結(jié)點鏈和哈希鏈的流程圖;圖4是子過程GenChild生成子結(jié)點的流程圖;圖5是函數(shù)EpiExtend生成延伸計數(shù)和延伸時間戳隊列的流程圖;圖6是編碼后頻繁情節(jié)樹的存儲結(jié)構(gòu)圖。
具體實施例方式下面結(jié)合附圖和實例對本發(fā)明作進一步詳細的說明。如圖1所示,本發(fā)明方法的步驟包括(1)對相關(guān)數(shù)據(jù)結(jié)構(gòu)進行初始化。包括①將事件序列中包含的事件類型按照自然數(shù)遞增的順序進行編碼。若事件類型e 編碼為m,則在下面的描述中將其表示為其中,l<m<n,n為事件序列中事件類型的數(shù) 量;②對包含1-情節(jié)信息的結(jié)構(gòu)數(shù)組印1_1中的count和time域進行初始化,即執(zhí) 行 epi_l [m]. count = 0 ;epi_l [m]. time = 0,其中,1 ^ m ^ η ;epi_l是長度為η的結(jié)構(gòu)數(shù)組,元素印1_1 [m]表示編碼為m的1_情節(jié),包含2個 數(shù)據(jù)域
count域表示1_情節(jié)計數(shù);time域表示1_情節(jié)發(fā)生的時間戳。③對包含2-情節(jié)信息的情節(jié)矩陣進行初始化。情節(jié)矩陣在程序中體現(xiàn)為一個二 維結(jié)構(gòu)數(shù)組印1_2,每一維的長度為n,每個數(shù)組元素^)i_2[p] [q]包含3個域count 表示2_情節(jié)的發(fā)生計數(shù);tq 是2-情節(jié)的時間戳隊列;state 表示矩陣元素[ep,eq]的修改狀態(tài),它只取2個值,“0”代表“可修改”狀 態(tài);“1”代表“不可修改”狀態(tài)。對情節(jié)矩陣的初始化就是對這三個域的初始設(shè)置,即執(zhí)行[p] [q]. count = 0,epi_2 [ρ] [q] · tq = NULL,epi_2 [p] [q] · state =(2)判斷事件序列是否已掃描完,若已掃描完,則轉(zhuǎn)入步驟(6);否則進入步驟 ⑶;(3)讀取掃描事件(e,t),取事件類型e對應(yīng)的編碼m ;(4)數(shù)組元素epi_l [m]的count域加1,time域賦值為t ;(5)調(diào)用子過程 GenMinOcc (e,t),轉(zhuǎn)入步驟(2);子過程GenMinOcc (e,t)的功能為生成與事件(e,t)相關(guān)的2_情節(jié)的最小發(fā)生信 息,并記錄在情節(jié)矩陣中。本發(fā)明挖掘的是最小發(fā)生的頻繁情節(jié)。給定情節(jié)EP = ei-e2-. . . _en,對于它的發(fā) 生印=(e1 ti) (e2,t2). . . (en,tn)(其中、<、<...< tn滿足全序關(guān)系),如果不存在 任何 EP 的發(fā)生印,=(ei; V ) (e2, t2,)··· (en, tn,)滿足:t/ 彡 t1 tn 彡 tn,且 tn,-t/ < Vt1,則稱ep為情節(jié)EP的最小發(fā)生。子過程GenMinOcc (e, t)的執(zhí)行流程如圖2所示,具體說明如下(5. 1)情節(jié)矩陣的行索引r初始化為1,取事件類型e的編碼m ;(5. 2)判斷是否所有的矩陣行都已處理完,若處理完,則轉(zhuǎn)入步驟(5. 8);否則,進 入步驟(5. 3);(5. 3)判斷矩陣元素[er, e]的修改狀態(tài)是否為“可修改”,即判斷epi_2[r] [m], state的值是否等于“0”,若是,則進入步驟(5.4);否則轉(zhuǎn)入步驟(5.7);(5. 4) 2-情節(jié) er-e 的發(fā)生計數(shù)加 1,即執(zhí)行 epi_2 [r] [m] · count++ ;(5. 5)將時間戳t追加到時間戳隊列epi_2 [r] [m] · tq的尾部;(5.6)將矩陣元素[er, e]的狀態(tài)設(shè)置為“不可修改”,即執(zhí)行印i_2[r] [m]. state =1 ;(5. 7)行索引r加1,轉(zhuǎn)入步驟(5. 2);(5. 8)情節(jié)矩陣的列索引c初始化為1 ;(5. 9)判斷是否所有的矩陣列都已處理完,若處理完,則從GenMinOcc (e, t)中返 回;否則,進入步驟(5. 10);(5. 10)判斷矩陣元素[e,ej的修改狀態(tài)是否為“不可修改”,即判斷^i_2[m] [c]· state的值是否為“1”,若是,則進入步驟(5. 11);否則轉(zhuǎn)入步驟(5. 12);(5. 11)將矩陣元素[e,ec]的狀態(tài)設(shè)置為“可修改”,即執(zhí)行^i_2[m] [c], state = 0 ;
(5. 12)列索引c加1,轉(zhuǎn)入步驟(5. 9);(6)在數(shù)組印1_1中選擇頻繁的I-情節(jié),即選擇數(shù)組印1_1中域count彡min_ sup (min_sup是預(yù)設(shè)的頻繁數(shù)閾值)的元素,并將其所對應(yīng)的事件按照count域降序排列, 形成事件隊列queue ;數(shù)組印1_1中域count彡min_sup的元素將構(gòu)成頻繁的1_情節(jié),因此,隊列queue 包含了全部的頻繁1-情節(jié)。隊列queue在程序中體現(xiàn)為一個結(jié)構(gòu)數(shù)組,其長度為事件序列 中包含的頻繁1-情節(jié)數(shù)量,每個數(shù)組元素包含2個數(shù)據(jù)域name 表示事件類型名count 表示相應(yīng)的1_情節(jié)計數(shù)(7)將queue隊列索引j賦值為1 ;(8)在情節(jié)樹中建立根的子結(jié)點ce,取queue [j]的相關(guān)信息賦值給ce的name和 count域,并將ce賦值給fe作為進一步延伸的父結(jié)點,即執(zhí)行ce. name = queue [j]. name ; ce.count = queue[j]. count ;fe = ce ;情節(jié)樹中存儲事件序列上所有的頻繁情節(jié),因此,建樹的過程就是頻繁情節(jié)挖掘 的過程。樹中第k層結(jié)點稱為k_情節(jié)結(jié)點,代表長度為k的一個頻繁情節(jié),該k_情節(jié)的首 事件是k-情節(jié)結(jié)點本身,尾事件是ι-情節(jié)結(jié)點,k-情節(jié)結(jié)點到1-情節(jié)結(jié)點路徑上的每個 結(jié)點按照由高層到低層的順序構(gòu)成情節(jié)的中間結(jié)點。樹中不同層結(jié)點根據(jù)需要具有不同的數(shù)據(jù)域,其中,第1層結(jié)點包含3個域,分別 為 name, count 禾口 next ;第 k(k > 1)層結(jié)點包含 5 個域,分另Ij為 name, count, tq/tqcode, next和samenext。各個數(shù)據(jù)域的含義如下name 事件類型名count 結(jié)點所表示的情節(jié)的計數(shù)tq 時間戳隊列(編碼前包含該域)tqcode 時間戳隊列編碼(編碼后包含該域)next 指向孩子結(jié)點的指針samenext 指向相同結(jié)點鏈中下一個結(jié)點的指針時間戳隊列tq定義為由情節(jié)所有最小發(fā)生的首事件的時間戳按照升序形成的隊 列。本發(fā)明將基于時間戳隊列tq對低階情節(jié)進行延伸,生成任意長度的頻繁情節(jié)。queue [j]是頻繁1_情節(jié),因此,本步驟將它加入情節(jié)樹中作為第1層結(jié)點。子結(jié) 點ce建立后,將賦值給fe以便在后面的步驟中對該1-情節(jié)進行延伸。(9)子結(jié)點編號i賦值為1 ;編號i是對fe進行橫向延伸建立它的子結(jié)點的編號。(10)如果fe已延伸完畢,建立了所有的子結(jié)點,即i >n,則轉(zhuǎn)入步驟(18);否則 進入步驟(11);(11)判斷2-情節(jié)e-fe. name是否頻繁,即取事件fe. name的編號m,若epi_2 [i] [m], count彡min_Sup,則表明2-情節(jié)ei-fe. name是頻繁的,進入步驟(12);否則,轉(zhuǎn)入步 驟(17);(12)在樹中建立fe的子結(jié)點ce,并將2_情節(jié)ei-fe. name的相關(guān)信息賦值給ce 白勺name、count禾口 tq域,奪其next禾口 samenext域貝武值為空;
9
該步驟中,子結(jié)點ce屬第2層結(jié)點,代表2-情節(jié)ei_fe. name,它的各個域具體設(shè) 置為ce. name = ej ;ce. count = epi_2 [i] [m]. count ;ce. tq = epi_2 [i] [m]. tq ;ce. next = NULL ;ce. samenext = NULL ;(13)對ce的時間戳隊列tq進行編碼。設(shè)時間戳隊列tq = (t1; t2,. . .,tq),則其編碼tqcode為tqcode = hash{tq) = mod((^ ^.)/100)
_ ______ ______ -- i=\ .........(14)調(diào)用函數(shù)GenModLinkke)建立或修改ce的相同結(jié)點鏈和哈希鏈;本發(fā)明根據(jù)樹中結(jié)點的編碼不同共設(shè)置了 100個哈希鏈,編碼相同的結(jié)點鏈 接在同一個哈希鏈中。哈希鏈的首指針存放在數(shù)組haShlink[100]中,haShlink
haShlink[99]分別存放哈希值為0 99的鏈首指針,初始狀態(tài)各哈希鏈尚未建立,因此,設(shè) 置hashlinkR] = NULL,0彡k < 100。哈希鏈中每個結(jié)點包含5類數(shù)據(jù)域name 事件類型名count 情節(jié)計數(shù)tq:時間戳隊列next 指向哈希鏈中下一個結(jié)點的指針psame 指向相同結(jié)點鏈鏈首結(jié)點的指針本發(fā)明中,將情節(jié)樹中事件類型、計數(shù)和時間戳隊列都相同的結(jié)點稱為相同結(jié)點, 同事件類型的所有相同結(jié)點相互連接形成相同結(jié)點鏈。情節(jié)樹中根據(jù)事件類型不同,可能 存在多條相同結(jié)點鏈。函數(shù)GenModLinkke)的執(zhí)行流程如圖3所示,具體說明如下(14. 1)將標志變量flag置0 ;變量flag標志著與ce相應(yīng)的相同結(jié)點鏈是否已經(jīng)建立,flag = 0表示該鏈尚未 建立;flag = 1表示該鏈已經(jīng)建立。因最初不存在任何相同結(jié)點鏈,因此,該步驟將變量flag設(shè)置為0。(14. 2)判斷是否已經(jīng)存在ce的哈希鏈,即判斷hashlinktce. tqcode]的值是否為 “NULL”,如果為空,表示ce的哈希鏈尚未建立,則進入步驟(14. 3),否則轉(zhuǎn)入步驟(14.4);(14. 3)申請一個哈希鏈結(jié)點 node,并令 hashlink[ce. tqcode] = node,建立相應(yīng) 的哈希鏈,轉(zhuǎn)入步驟(14.6);(14.4)判斷ce的信息是否已在相應(yīng)的哈希鏈中,如果已在鏈中,則轉(zhuǎn)入步驟 (14.7);否則,進入步驟(14.5);(14. 5)在哈希鏈尾追加新結(jié)點node ;(14. 6)結(jié)點 node 的各個域賦值,具體為:node. name = ce. name ;node, count =ce. count ;node, tq = ce. tq ;node, next = NULL ;node, psame = ce ;然后函數(shù) GenModLink(ce)返回,此時,函數(shù)返回值為flag = 0 ;(14. 7)將ce追加到相應(yīng)的相同結(jié)點鏈尾;(14.8)將標志變量flag置1,然后函數(shù)GenModLinkke)返回,此時,函數(shù)返回值 為 flag = 1。
(15)若函數(shù)GenModLink (ce)的返回值為1,則表示ce的相同結(jié)點鏈已經(jīng)存在,ce 無需進一步延伸生成它的子結(jié)點,則轉(zhuǎn)入步驟(17);否則,表示尚不存在ce的相同結(jié)點鏈, 則進入步驟(16);(16)將ce賦值給fe作為父結(jié)點,并調(diào)用子過程GenChilcKfe)生成fe的子結(jié)點;子過程GenChilcKfe)生成fe的子結(jié)點的過程就是對fe結(jié)點不斷延伸,生成所有 以fe為后綴的高階情節(jié)結(jié)點的過程,包括橫向延伸和縱向延伸兩種。橫向延伸是fe在寬 度上的延伸,主要基于fe所表示的情節(jié)和以fe為尾事件的頻繁2-情節(jié)進行;縱向延伸是 fe在深度上的延伸,通過遞歸調(diào)用子過程GenChilcKfe)實現(xiàn)。子過程GenChild(fe)的執(zhí) 行流程如圖4所示,具體說明如下(16. 1)橫向延伸編號hi初始化為1 ;(16.2)判斷fe是否橫向延伸完畢,即判斷是否hi >η,η是事件序列中事件類 型的數(shù)量。若hi >η,則轉(zhuǎn)入步驟(16. 12);否則,說明尚未完成fe的橫向延伸,進入步驟 (16. 3)繼續(xù)進行橫向延伸;(16. 3)判斷以fe為尾事件的2_情節(jié)ehi-fe是否頻繁,若頻繁,則進入步驟 (16.4);否則,轉(zhuǎn)入步驟(16. 11);(16. 4)取 fe. name 的事件類型編號 m,調(diào)用函數(shù) EpiExtend (fe. tq,ep_2 [hi] [m], tq)對fe進行橫向延伸;函數(shù) EpiExtend (tql,tq2)的輸入?yún)?shù) tql = fe. tq, tq2 =印_2 [hi] [m] · tq,分 別為fe所表示的情節(jié)的時間戳隊列和2-情節(jié)ehi-fe的時間戳隊列,通過對二者進行比較 實現(xiàn)fe的橫向延伸,產(chǎn)生其延伸情節(jié),并生成延伸計數(shù)和延伸時間戳隊列作為函數(shù)輸出。設(shè)k-情節(jié)(k ^ 2) EPl = e\-e\ -Λ -e\, 2-情節(jié) = ef - e22,若 e22 = e;,則 EPl 和 EP2的延伸情節(jié),即k+1情節(jié)=彳-ei -Λ -e\。若EP的延伸計數(shù)ext_count彡min_ sup,則說明EP是頻繁的,結(jié)點fe需要建立子結(jié)點。函數(shù)EpiExtend(tql,tq2)的執(zhí)行流程如圖5所示,具體說明如下(16. 4. 1)相關(guān)變量初始化,包括延伸計數(shù)ext_COunt初始化為0 ;tq2、tql隊列 的索引P、q初始化為0 ;延伸時間戳隊列ext_tq初始化為空;(16.4.2)判斷tql或tq2是否已到尾部,若未到尾部,則進入步驟(16.4.3);否 則,從函數(shù)EpiExtend(tq 1,tq2)中返回;(16.4.3)比較 tq2[p]與 tql [q],若 tq2 [ρ]彡 tql [q],則進入步驟(16.4.4);否 則,轉(zhuǎn)入步驟(16.4.5);(16. 4. 4) tql隊列索引q加1,重復(fù)執(zhí)行步驟(16.4.3);(16. 4. 5)延伸計數(shù) ext_count 加 1,tq2 隊列索引 ρ 加 1 ;(16.4.6)比較 tq2[p]與 tql[q],若 tq2[p] < tql [q],則進入步驟(16. 4. 7);否 則,轉(zhuǎn)入步驟(16.4.8);(16. 4. 7)tq2隊列索引ρ加1,重復(fù)執(zhí)行步驟(16. 4. 6);(16. 4. 8)將tq2 [p_l]追加到延伸時間戳隊列ext_tq的尾部,轉(zhuǎn)入步驟 (16. 4. 2)。(16. 5)判斷延伸情節(jié)是否頻繁,即是否有延伸計數(shù)eXt_Coimt彡min_sup,若頻 繁,則進入步驟(16.6);否則,轉(zhuǎn)入步驟(16. 11);
11
(16.6)在樹中建立 fe 的子結(jié)點 ce,并設(shè)置 ce. name = ehi ;ce. count = ext_ count ;ce.tq = ext_tq ;ce.next = NULL ;ce.samenext = NULL ;(16. 7)按照步驟(13)的編碼公式對ce. tq進行編碼;(16. 8)調(diào)用函數(shù)GenModLink (ce)建立或修改ce的相同結(jié)點鏈和哈希鏈; GenModLink(ce)的具體執(zhí)行步驟見(14. 1)-(14. 8);(16.9)若函數(shù)GenModLink(Ce)的返回值為1,則ce無需再進行縱向延伸,轉(zhuǎn)入步 驟(16. 11);否則,進入步驟(16. 10);(16. 10)將ce賦值給fe,遞歸調(diào)用過程GenChild (fe)生成fe的子結(jié)點實現(xiàn)縱向 延伸;(16. 11)橫向延伸編號hi加1,轉(zhuǎn)入步驟(16. 2);(16. 12)返回fe的父結(jié)點,賦值給fe ;其橫向延伸編號賦值給變量hi ;(16. 13)判斷fe是否為1_情節(jié)結(jié)點,如果不是,則進入步驟(16. 14);如果fe是 1-情節(jié)結(jié)點,表示fe的所有延伸都已完成,以fe為后綴的所有頻繁情節(jié)都已生成,因此,子 過程GenChiId (fe)執(zhí)行結(jié)束。(16.14)遞歸調(diào)用子過程GenChilcKfe),并將橫向延伸編號hi加1,轉(zhuǎn)入步驟 (16. 2)。(17)子結(jié)點編號i增1,轉(zhuǎn)入步驟(10);(18)判斷事件隊列queue是否已取到尾,若已取到尾,表示已經(jīng)建立完整的情節(jié) 樹,事件序列上所有的頻繁情節(jié)都已挖掘出來并存儲在樹中,則轉(zhuǎn)入步驟OO);否則,進入 步驟(19);(19) queue隊列的索引j加1,轉(zhuǎn)入步驟(8),繼續(xù)挖掘以queue [j] · name為后綴的 頻繁情節(jié);(20)根據(jù)情節(jié)樹中存儲的情節(jié)語義進行情節(jié)輸出。根據(jù)樹所表示的情節(jié)語義,樹中每個結(jié)點代表由其自身到1-情節(jié)結(jié)點所在分支 構(gòu)成的頻繁情節(jié),因此,樹中每個非1-情節(jié)結(jié)點到1-情節(jié)結(jié)點經(jīng)過的路徑便構(gòu)成了全部的 頻繁情節(jié)。具體輸出時,非1-情節(jié)結(jié)點分為兩種情況,每種情況的情節(jié)輸出過程如下①非1-情節(jié)結(jié)點是相同結(jié)點鏈中的首結(jié)點此種情況下,由非1-情節(jié)結(jié)點到1-情節(jié)結(jié)點路徑上的每個結(jié)點都是由上層結(jié)點 延伸生成,因此,直接輸出路徑上的結(jié)點即可,即由高層結(jié)點作為情節(jié)首結(jié)點,路徑上的結(jié) 點按照由高層到低層的順序依次作為中間節(jié)點,路徑上的1-情節(jié)結(jié)點作為尾結(jié)點進行情 節(jié)輸出。②非1-情節(jié)結(jié)點是相同結(jié)點鏈中的非首結(jié)點此種情況下,非1-情節(jié)結(jié)點向其子結(jié)點的延伸過程由于建立相同結(jié)點鏈而被省 略,它將與相同結(jié)點鏈上的其它結(jié)點共享相同的子結(jié)點,因此,該非1-情節(jié)結(jié)點到1-情節(jié) 結(jié)點路徑上所包含的結(jié)點只能構(gòu)成部分頻繁情節(jié),另一部分頻繁情節(jié)需要借助相同結(jié)點鏈 生成。為此,需要定位相同結(jié)點鏈的鏈首,具體定位方法為設(shè)非1-情節(jié)結(jié)點為nodel,則按照nodel. name查找哈希鏈hashlink[nodel. tqcode],設(shè)找到的哈希結(jié)點為n0de2,則n0de2. psame所指向的就是nodel所在相同結(jié)點鏈 的鏈首結(jié)點。
情節(jié)輸出路徑包含兩部分,一部分路徑由鏈首結(jié)點的所有子結(jié)點按照由高層到低 層的順序構(gòu)成,另一部分路徑由鏈首結(jié)點到ι-情節(jié)的路徑構(gòu)成。完整路徑中的所有結(jié)點都 代表了相應(yīng)的頻繁情節(jié),可分別進行輸出。使用本發(fā)明方法在大量的數(shù)據(jù)上進行了測試,驗證了其與傳統(tǒng)類Apriori方法相 比在時間和空間性能上的優(yōu)勢。以下是其中的一個實例。測試的硬件環(huán)境=CPU為INTEL 2. 66GHz,內(nèi)存為3. 5GB的PC機。軟件環(huán)境操作系統(tǒng)為Windows XP Professional 2002,開發(fā)語言為Visual C++6. 0。測試數(shù)據(jù)來自Intel伯克利實驗室布置的討個無線傳感器從2004年2月觀日 至 2004年 4 月 5 日產(chǎn)生的數(shù)據(jù)(http://db. csail.mit. edu/labdata/labdata. html),每個 事件包含傳感器編號、時間戳、溫度等屬性。測試時從中選出27個傳感器,并將溫度屬性值 分為4個區(qū)間,形成了 27*4 = 108個事件類型,事件序列長度最多包含10萬個事件。測試方案和結(jié)果本發(fā)明從以下兩個方面對所提出的方法進行了測試。①對于固定長度的事件序列,分別設(shè)定不同的頻繁數(shù)閾值,測試本發(fā)明方法的挖 掘時間,并與傳統(tǒng)的類Apriori方法的挖掘時間進行比較;從上面的步驟描述中可以看出,在情節(jié)挖掘過程中,一直使用頻繁數(shù)閾值min-sup 來衡量情節(jié)的頻繁性。由于事件序列較長,頻繁數(shù)閾值min-sup取值較大,為了表達方便, 在以下的結(jié)果描述中將頻繁數(shù)閾值min-sup折算為頻繁度閾值min_fre,折算方法是min_fre = min_sup/len_seq其中,len_seq是事件序列長度。下表給出了挖掘時間隨頻繁度閾值min_fre的變化情況
權(quán)利要求
1.一種基于相同結(jié)點鏈和哈希鏈的事件序列頻繁情節(jié)挖掘方法,包括以下步驟(1)對相關(guān)數(shù)據(jù)結(jié)構(gòu)進行初始化,包括①將事件序列中包含的事件類型按照自然數(shù)遞增的順序進行編碼;②對包含1-情節(jié)信息的結(jié)構(gòu)數(shù)組印1_1中的count和time域進行初始化;③對包含2-情節(jié)信息的情節(jié)矩陣進行初始化;(2)判斷事件序列是否已掃描完,若已掃描完,則轉(zhuǎn)入步驟(6);否則進入步驟(3);(3)在事件序列上讀取掃描事件(e,t);(4)將事件類型e的發(fā)生計數(shù)加1,發(fā)生的時間戳t記錄在相應(yīng)的印1_1數(shù)組元素中;(5)調(diào)用函數(shù)GenMinOcc(e, t),生成與事件(e,t)相關(guān)的2-情節(jié)的最小發(fā)生信息并記 錄在情節(jié)矩陣中,轉(zhuǎn)入步驟O);(6)在數(shù)組epi_l中選擇頻繁的1-情節(jié),并將其按照發(fā)生計數(shù)降序排列,形成事件隊 列 queue ;(7)將queue隊列索引j賦值為1;(8)在情節(jié)樹中建立根的子結(jié)點ce,取queue[j]的相關(guān)信息賦值給ce的相關(guān)數(shù)據(jù)域, 并將ce賦值給fe作為進一步延伸的父結(jié)點;(9)子結(jié)點編號i賦值為1;(10)如果fe已延伸完畢,建立了所有的子結(jié)點,即i>n(η為事件序列中包含的事件類 型的數(shù)量),則轉(zhuǎn)入步驟(18);否則進入步驟(11);(11)判斷2-情節(jié)ei-fe.name是否頻繁,若頻繁,則進入步驟(12);否則,轉(zhuǎn)入步驟 (17);(12)在樹中建立fe的子結(jié)點ce,并將2_情節(jié)ei-fe.name的相關(guān)信息賦值給ce的相 關(guān)數(shù)據(jù)域;(13)對ce的時間戳隊列進行編碼;設(shè)時間戳隊列討=(、t2,…,、),則其編碼tqcode為
2.根據(jù)權(quán)利要求1所述的方法,其特征在于步驟⑶中所述調(diào)用子過程 GenMinOcc (e, t)的執(zhí)行流程為(5. 1)情節(jié)矩陣的行索引r初始化為1,取事件類型e的編碼m ; (5.2)判斷是否所有的矩陣行都已處理完,若處理完,則轉(zhuǎn)入步驟(5.8);否則,進入 步驟(5. 3);(5. 3)判斷矩陣元素[er, e]的修改狀態(tài)是否為“可修改”,即判斷epi_2[r] [m], state 的值是否等于“0”,若是,則進入步驟(5.4);否則轉(zhuǎn)入步驟(5.7);(5. 4) 2-情節(jié)er-e的發(fā)生計數(shù)加1,即執(zhí)行epi_2[r] [m], count++ ;(5. 5)將時間戳t追加到時間戳隊列epi_2[r] [m].tq的尾部;(5. 6)將矩陣元素[er, e]的狀態(tài)設(shè)置為“不可修改”,即執(zhí)行epi_2 [r] [m] · State=I ;(5.7)行索引r加1,轉(zhuǎn)入步驟(5. 2);(5. 8)情節(jié)矩陣的列索引c初始化為1 ;(5.9)判斷是否所有的矩陣列都已處理完,若處理完,則從GenMinOcc(e,t)中返回; 否則,進入步驟(5. 10);(5.10)判斷矩陣元素[e,ej的修改狀態(tài)是否為“不可修改”,即判斷印1_2[m] [c]. state的值是否為“1”,若是,則進入步驟(5. 11);否則轉(zhuǎn)入步驟(5. 12);(5.11)將矩陣元素[e,ej的狀態(tài)設(shè)置為“可修改”,即執(zhí)行印1_2 [m] [c]. State=O ; (5. 12)列索引c加1,轉(zhuǎn)入步驟(5. 9)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于步驟(14)中所述調(diào)用函數(shù) GenModLink(ce)的執(zhí)行流程為(14. 1)將標志變量flag置0 ;(14.2)判斷是否已經(jīng)存在ce的哈希鏈,即判斷hashlinktce.tqcode]的值是否為 “NULL”,如果為空,表示ce的哈希鏈尚未建立,則進入步驟(14. 3),否則轉(zhuǎn)入步驟(14.4);(14. 3)申請一個哈希鏈結(jié)點node,并令hashlink[ce. tqcode] =node,建立相應(yīng)的哈 希鏈,轉(zhuǎn)入步驟(14.6);(14.4)判斷ce的信息是否已在相應(yīng)的哈希鏈中,如果已在鏈中,則轉(zhuǎn)入步驟(14.7); 否則,進入步驟(14.5);(14. 5)在哈希鏈尾追加新結(jié)點node ;(14. 6) 結(jié)點 node 的各個域賦值,具體為node. name=ce. name ; node, count= ce. count ; node. tq=ce. tq; node. next=NULL; node. psame=ce;然后函數(shù)GenModLink(ce) 返回,此時,函數(shù)返回值為flag=0 ;(14.7)將ce追加到相應(yīng)的相同結(jié)點鏈尾;(14.8)將標志變量flag置1,然后函數(shù)GenModLink(Ce)返回,此時,函數(shù)返回值為 f Iag=I ο
4.根據(jù)權(quán)利要求1所述的方法,其特征在于步驟(16)中所述調(diào)用子過程 GenChiId (fe)的執(zhí)行流程為(16. 1)橫向延伸編號hi初始化為1 ;(16. 2)判斷fe是否橫向延伸完畢,即判斷是否hi>n,η是事件序列中事件類型的數(shù) 量,若hi>n,則轉(zhuǎn)入步驟(16. 12);否則,進入步驟(16.3)繼續(xù)進行橫向延伸;(16.3)判斷以fe為尾事件的2-情節(jié)e^-fe是否頻繁,若頻繁,則進入步驟(16.4); 否則,轉(zhuǎn)入步驟(16. 11);(16. 4)取 fe. name 的事件類型編號 m,調(diào)用函數(shù) EpiExtend (fe. tq, ep_2 [hi] [m]. tq) 對fe進行橫向延伸;(16. 5)判斷延伸情節(jié)是否頻繁,即是否有延伸計數(shù)eXt_COimt彡min_SUp,若頻繁,則 進入步驟(16.6);否則,轉(zhuǎn)入步驟(16. 11);(16. 6)在樹中建立 fe 的子結(jié)點 ce,并設(shè)置 ce. name=ehi ;ce. count=ext_count ; ce. tq=ext_tq ;ce. next=NULL ;ce.samenext= NULL ;(16. 7)按照步驟(13)的編碼公式對ce. tq進行編碼;(16. 8)調(diào)用函數(shù)GenModLink (ce)建立或修改ce的相同結(jié)點鏈和哈希鏈; GenModLink(ce)的具體執(zhí)行步驟按(14. 1)-(14. 8)進行;(16.9)若函數(shù)GenModLink(Ce)的返回值為1,則ce無需再進行縱向延伸,轉(zhuǎn)入步驟 (16. 11);否則,進入步驟(16. 10);(16. 10)將ce賦值給fe,遞歸調(diào)用過程GenChild (fe)生成fe的子結(jié)點實現(xiàn)縱向延伸;(16. 11)橫向延伸編號hi加1,轉(zhuǎn)入步驟(16. 2); (16. 12)返回fe的父結(jié)點,賦值給fe ;其橫向延伸編號賦值給變量hi ; (16.13)判斷fe是否為1-情節(jié)結(jié)點,如果不是,則進入步驟(16. 14);如果fe是1_情 節(jié)結(jié)點,子過程GenChilcKfe)執(zhí)行結(jié)束;(16. 14)遞歸調(diào)用子過程GenChilcKfe),并將橫向延伸編號hi加1,轉(zhuǎn)入步驟(16. 2)。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于步驟(16. 4)中所述調(diào)用函數(shù) EpiExtend (tql,tq2)的執(zhí)行流程為(16. 4. 1)相關(guān)變量初始化,包括延伸計數(shù)eXt_COimt初始化為O ;tq2、tql隊列的索 引P、q初始化為O ;延伸時間戳隊列ext_tq初始化為空;(16.4.2)判斷tql或tq2是否已到尾部,若未到尾部,則進入步驟(16.4.3);否則,從 函數(shù) EpiExtend (tql, tq2)中返回;(16.4.3)比較tq2[p]與 tql [q],若 tq2 [ρ]彡 tql [q],則進入步驟(16.4.4);否則, 轉(zhuǎn)入步驟(16. 4. 5);(16.4.4)tql隊列索引q加1,重復(fù)執(zhí)行步驟(16.4.3); (16. 4. 5)延伸計數(shù)ext_count加1,tq2隊列索引ρ加1 ;(16.4.6)比較 tq2[p]與 tql [q],若 tq2 [ρ] <tql [q],則進入步驟(16.4.7);否則,轉(zhuǎn) 入步驟(16. 4. 8);(16. 4. 7) tq2隊列索引ρ加1,重復(fù)執(zhí)行步驟(16. 4. 6);(16. 4. 8)將tq2[p-l]追加到延伸時間戳隊列ext_tq的尾部,轉(zhuǎn)入步驟(16. 4. 2)。
全文摘要
本發(fā)明提供了一種事件序列上挖掘最小發(fā)生頻繁情節(jié)的方法,通過對低階頻繁情節(jié)進行逐級的延伸直接生成高階頻繁情節(jié)。本發(fā)明提供的發(fā)現(xiàn)情節(jié)的最小發(fā)生并對其進行計數(shù)的方法,通過建立情節(jié)矩陣并在矩陣元素上設(shè)置相應(yīng)的修改狀態(tài)發(fā)現(xiàn)2-情節(jié)的最小發(fā)生并實現(xiàn)計數(shù),通過對頻繁的2-情節(jié)進行基于時間戳隊列的延伸來發(fā)現(xiàn)k-情節(jié)(k>2)的最小發(fā)生并實現(xiàn)計數(shù)。本發(fā)明提供的基于相同結(jié)點鏈和哈希鏈建立情節(jié)樹的情節(jié)挖掘方法,節(jié)省了情節(jié)延伸的時間和所占用的內(nèi)存空間,在挖掘過程中,只需掃描數(shù)據(jù)一次,無需生成候選情節(jié)集合,挖掘效率高,占用內(nèi)存空間少,并具有挖掘時間成本不隨頻繁數(shù)閾值明顯變化的良好特性,可被擴展到事件流上的情節(jié)挖掘。
文檔編號G06F17/30GK102073732SQ20111002015
公開日2011年5月25日 申請日期2011年1月18日 優(yōu)先權(quán)日2011年1月18日
發(fā)明者喬建忠, 林樹寬 申請人:東北大學(xué)