基于相同结点链和哈希链的事件序列频繁情节挖掘方法

文档序号:6353313阅读:382来源:国知局
专利名称:基于相同结点链和哈希链的事件序列频繁情节挖掘方法
技术领域
本发明属于时态数据挖掘技术,具体涉及一种基于相同结点链和哈希链的事件序 列频繁情节挖掘的方法及系统。
背景技术
随着传感器和无线射频识别(feidio Frequency Identification, RFID)等电子数 据采集设备(Electronic Data Gathering Equipment, EDGE)在供应链管理、环境监控及 物联网等诸多领域中被广泛使用,产生了大量的事件类型的数据,复杂事件处理(Complex Event Processing, CEP)技术越来越受到关注和重视,逐渐成为数据库领域继数据流之后 新的研究热点。频繁情节挖掘是CEP的重要研究内容,其方法和技术可以应用在很多方面, 如网络入侵检测、财政事件和股票趋势分析、电信网络报警和物联网等,通过挖掘事件序列 中的频繁情节,可以建立相应的关联规则,从而挖掘出隐藏在事件数据中的有价值的信息。 例如,在物联网的各种监控应用中,由传感器和RFID设备可以产生大量的监控数据,这些 监控数据形成一个事件序列。序列中的事件并不是独立的,在某些时间点发生的事件可能 与另一些时间点上事件的发生有着必然的联系,也就是说,在事件序列中存在关联规则。我 们可以通过挖掘事件序列中的频繁情节产生这些规则,从而掌握隐藏在事件序列中的事件 关联关系及事件发生的规律。CEP 43 ^^ ^ (eventtype, time, location, attr1 attr2, . . . , attrn)的 数据模式,其中,eventtype是事件类型名,time是事件发生的时间戳,location是事件发 生的地点,具体体现为检测出事件的传感器或RFID阅读器的编号,Bttr1, attr2, ... , attrn 是若干事件属性。事件按照time域升序构成事件序列。所谓情节是事件序列上发生的事 件的偏序集合。从以上定义可以看出,事件序列上的频繁情节挖掘不同于事务数据库上的 频繁模式挖掘,后者实际上是对频繁项集的挖掘,不需要考虑一个模式内部各项之间的先 后顺序,而事件序列中的事件具有很强的时态特性,相同事件集合中的事件以不同的顺序 发生将构成不同的情节,因此,情节挖掘必须考虑情节内部各事件发生的顺序;频繁情节挖 掘也不同于序列模式挖掘,二者虽然都是对事件类型的数据进行处理,但前者是在单一的 事件序列上进行挖掘,而后者是在一组事件序列上进行挖掘。因此,现有的频繁模式和序列 模式挖掘方法不能用于频繁情节挖掘。通常,频繁情节按照产生的方式分成两大类,一类是基于窗口的频繁情节;另一类 是最小发生的频繁情节。挖掘基于窗口的频繁情节对于建立情节规则存在以下问题(1) 一个情节在一个窗口内的几次发生只被计数一次;( 一个情节的一次有效发生由于被包 含在不同的窗口中而被计数多次。这些问题不利于建立情节规则。挖掘最小发生的频繁情 节考虑情节的实际发生次数而不是包含情节的窗口的个数,有利于建立相应的情节规则; 此外,挖掘最小发生的频繁情节关注最晚开始、最早结束的情节发生(即最小发生),基于 最小发生的频繁情节建立规则,有助于对未来事件做出最早的预测。本发明对最小发生的 频繁情节进行挖掘。
5
就挖掘方法而言,现有的情节挖掘主要采用类Apriori方法。Apriori算法是用来 在事务数据库或数据流上挖掘频繁模式的经典算法。事件序列上的类Apriori情节挖掘方 法在考虑事件数据特点的同时,借鉴了 Apriori算法的挖掘思想,它们保留了 Apriori算法 的特点,需要经过由低阶频繁情节产生高阶候选情节集合,再通过对候选情节进行评价产 生高阶频繁情节的反复迭代过程,反复进行这样的迭代过程非常耗时,且生成的各阶候选 情节需占用大量的内存空间,导致挖掘的时间和空间性能较差;而且,该类方法由于需要对 数据进行多次扫描,只能局限于对静态数据进行处理,不能被扩展到事件流上进行挖掘。

发明内容
针对现有挖掘方法存在的问题,对于事件序列上最小发生的频繁情节,本发明提 供了一种基于相同结点链和哈希链的事件序列频繁情节挖掘方法。本发明提出的事件序列上挖掘最小发生频繁情节的方法,通过对低阶频繁情节进 行基于相同结点链和哈希链的逐级延伸直接生成高阶频繁情节。本发明提供的发现情节的 最小发生并对其进行计数的方法,通过建立情节矩阵并在矩阵元素上设置相应的修改状态 发现2-情节的最小发生并实现计数,通过对频繁的2-情节进行基于时间戳队列的延伸来 发现k-情节(k> 2)的最小发生并实现计数。本发明提供的基于相同结点链和哈希链的频繁情节挖掘方法,其步骤包括(1)对相关数据结构进行初始化。具体包括将事件序列中包含的事件类型按照 自然数递增的顺序进行编码;对包含1-情节信息的结构数组印1_1以及包含2-情节信息 的情节矩阵进行初始化;(2)判断事件序列是否已扫描完,若已扫描完,则转入步骤(6);否则进入步骤 ⑶;(3)在事件序列上读取扫描事件(e,t);(4)将事件e的发生计数加1,发生的时间戳t记录在相应的印1_1数组元素中;(5)调用函数GenMinOcc (e,t),生成与事件(e,t)相关的2_情节的最小发生信息 并记录在情节矩阵中,转入步骤O);(6)在数组epi_l中选择频繁的1-情节,并将其按照发生计数降序排列,形成事件 队列queue ;(7) queue队列索引j赋值为1 ;(8)在树中建立根的子结点ce,取queueU]的相关信息赋值给ce的相关数据域, 并将ce赋值给fe作为进一步延伸的父结点;(9)子结点编号i赋值为1 ;(10)如果fe已延伸完毕,建立了所有的子结点,即i >n(n为事件序列中包含的 事件类型的数量),则转入步骤(18);否则进入步骤(11);(11)判断2-情节ei_fe. name是否频繁,若频繁,则进入步骤(12);否则,转入步 骤(17);(12)在树中建立fe的子结点ce,并将2_情节ei-fe. name的相关信息赋值给ce 的相关数据域;(13)对ce的时间戳队列进行编码;
设时间戳队列tq =(、,、,...,tq),则其编码tqcode为tqcode = hash{tq) = mod((^ ^.)/100) (14)调用函数GenModLinkke)建立或修改ce的相同结点链和哈希链;(15)若函数GenModLinkke)的返回值为1,则表示ce的相同结点链已经存在,ce 无需进一步延伸生成它的子结点,则转入步骤(17);否则,表示尚不存在ce的相同结点链, 则进入步骤(16);(16)对ce做进一步延伸,将ce赋值给fe作为父结点,并调用子过程 GenChild(fe)生成fe的子结点;(17)子结点编号i加1,转入步骤(10);(18)判断事件队列queue是否已取到尾,若已取到尾,则转入步骤Q0);否则,进 入步骤(19);(19) queue队列索引j加1,转入步骤⑶;(20)根据情节树中存储的情节语义进行情节输出,编码后频繁情节树的存储结构 如图6所示。本发明通过对低阶频繁情节进行基于相同结点链和哈希链的逐级延伸,直接生成 全部的频繁情节,在此过程中,只需扫描数据一次,无需生成候选情节集合,显著提高了情 节挖掘的时间和空间性能,并可用于事件流上的情节挖掘。通过建立相同结点链和哈希链, 该方法具有时间成本不随频繁数阈值明显变化的良好特性。


图1是本发明方法的总流程图;图2是子过程GenMinOcc生成2_情节的最小发生信息的流程图;图3是函数GenModLink建立或修改相同结点链和哈希链的流程图;图4是子过程GenChild生成子结点的流程图;图5是函数EpiExtend生成延伸计数和延伸时间戳队列的流程图;图6是编码后频繁情节树的存储结构图。
具体实施例方式下面结合附图和实例对本发明作进一步详细的说明。如图1所示,本发明方法的步骤包括(1)对相关数据结构进行初始化。包括①将事件序列中包含的事件类型按照自然数递增的顺序进行编码。若事件类型e 编码为m,则在下面的描述中将其表示为其中,l<m<n,n为事件序列中事件类型的数 量;②对包含1-情节信息的结构数组印1_1中的count和time域进行初始化,即执 行 epi_l [m]. count = 0 ;epi_l [m]. time = 0,其中,1 ^ m ^ η ;epi_l是长度为η的结构数组,元素印1_1 [m]表示编码为m的1_情节,包含2个 数据域
count域表示1_情节计数;time域表示1_情节发生的时间戳。③对包含2-情节信息的情节矩阵进行初始化。情节矩阵在程序中体现为一个二 维结构数组印1_2,每一维的长度为n,每个数组元素^)i_2[p] [q]包含3个域count 表示2_情节的发生计数;tq 是2-情节的时间戳队列;state 表示矩阵元素[ep,eq]的修改状态,它只取2个值,“0”代表“可修改”状 态;“1”代表“不可修改”状态。对情节矩阵的初始化就是对这三个域的初始设置,即执行[p] [q]. count = 0,epi_2 [ρ] [q] · tq = NULL,epi_2 [p] [q] · state =(2)判断事件序列是否已扫描完,若已扫描完,则转入步骤(6);否则进入步骤 ⑶;(3)读取扫描事件(e,t),取事件类型e对应的编码m ;(4)数组元素epi_l [m]的count域加1,time域赋值为t ;(5)调用子过程 GenMinOcc (e,t),转入步骤(2);子过程GenMinOcc (e,t)的功能为生成与事件(e,t)相关的2_情节的最小发生信 息,并记录在情节矩阵中。本发明挖掘的是最小发生的频繁情节。给定情节EP = ei-e2-. . . _en,对于它的发 生印=(e1 ti) (e2,t2). . . (en,tn)(其中、<、<...< tn满足全序关系),如果不存在 任何 EP 的发生印,=(ei; V ) (e2, t2,)··· (en, tn,)满足:t/ 彡 t1 tn 彡 tn,且 tn,-t/ < Vt1,则称ep为情节EP的最小发生。子过程GenMinOcc (e, t)的执行流程如图2所示,具体说明如下(5. 1)情节矩阵的行索引r初始化为1,取事件类型e的编码m ;(5. 2)判断是否所有的矩阵行都已处理完,若处理完,则转入步骤(5. 8);否则,进 入步骤(5. 3);(5. 3)判断矩阵元素[er, e]的修改状态是否为“可修改”,即判断epi_2[r] [m], state的值是否等于“0”,若是,则进入步骤(5.4);否则转入步骤(5.7);(5. 4) 2-情节 er-e 的发生计数加 1,即执行 epi_2 [r] [m] · count++ ;(5. 5)将时间戳t追加到时间戳队列epi_2 [r] [m] · tq的尾部;(5.6)将矩阵元素[er, e]的状态设置为“不可修改”,即执行印i_2[r] [m]. state =1 ;(5. 7)行索引r加1,转入步骤(5. 2);(5. 8)情节矩阵的列索引c初始化为1 ;(5. 9)判断是否所有的矩阵列都已处理完,若处理完,则从GenMinOcc (e, t)中返 回;否则,进入步骤(5. 10);(5. 10)判断矩阵元素[e,ej的修改状态是否为“不可修改”,即判断^i_2[m] [c]· state的值是否为“1”,若是,则进入步骤(5. 11);否则转入步骤(5. 12);(5. 11)将矩阵元素[e,ec]的状态设置为“可修改”,即执行^i_2[m] [c], state = 0 ;
(5. 12)列索引c加1,转入步骤(5. 9);(6)在数组印1_1中选择频繁的I-情节,即选择数组印1_1中域count彡min_ sup (min_sup是预设的频繁数阈值)的元素,并将其所对应的事件按照count域降序排列, 形成事件队列queue ;数组印1_1中域count彡min_sup的元素将构成频繁的1_情节,因此,队列queue 包含了全部的频繁1-情节。队列queue在程序中体现为一个结构数组,其长度为事件序列 中包含的频繁1-情节数量,每个数组元素包含2个数据域name 表示事件类型名count 表示相应的1_情节计数(7)将queue队列索引j赋值为1 ;(8)在情节树中建立根的子结点ce,取queue [j]的相关信息赋值给ce的name和 count域,并将ce赋值给fe作为进一步延伸的父结点,即执行ce. name = queue [j]. name ; ce.count = queue[j]. count ;fe = ce ;情节树中存储事件序列上所有的频繁情节,因此,建树的过程就是频繁情节挖掘 的过程。树中第k层结点称为k_情节结点,代表长度为k的一个频繁情节,该k_情节的首 事件是k-情节结点本身,尾事件是ι-情节结点,k-情节结点到1-情节结点路径上的每个 结点按照由高层到低层的顺序构成情节的中间结点。树中不同层结点根据需要具有不同的数据域,其中,第1层结点包含3个域,分别 为 name, count 禾口 next ;第 k(k > 1)层结点包含 5 个域,分另Ij为 name, count, tq/tqcode, next和samenext。各个数据域的含义如下name 事件类型名count 结点所表示的情节的计数tq 时间戳队列(编码前包含该域)tqcode 时间戳队列编码(编码后包含该域)next 指向孩子结点的指针samenext 指向相同结点链中下一个结点的指针时间戳队列tq定义为由情节所有最小发生的首事件的时间戳按照升序形成的队 列。本发明将基于时间戳队列tq对低阶情节进行延伸,生成任意长度的频繁情节。queue [j]是频繁1_情节,因此,本步骤将它加入情节树中作为第1层结点。子结 点ce建立后,将赋值给fe以便在后面的步骤中对该1-情节进行延伸。(9)子结点编号i赋值为1 ;编号i是对fe进行横向延伸建立它的子结点的编号。(10)如果fe已延伸完毕,建立了所有的子结点,即i >n,则转入步骤(18);否则 进入步骤(11);(11)判断2-情节e-fe. name是否频繁,即取事件fe. name的编号m,若epi_2 [i] [m], count彡min_Sup,则表明2-情节ei-fe. name是频繁的,进入步骤(12);否则,转入步 骤(17);(12)在树中建立fe的子结点ce,并将2_情节ei-fe. name的相关信息赋值给ce 白勺name、count禾口 tq域,夺其next禾口 samenext域贝武值为空;
9
该步骤中,子结点ce属第2层结点,代表2-情节ei_fe. name,它的各个域具体设 置为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进行编码。设时间戳队列tq = (t1; t2,. . .,tq),则其编码tqcode为tqcode = hash{tq) = mod((^ ^.)/100)
_ ______ ______ -- i=\ .........(14)调用函数GenModLinkke)建立或修改ce的相同结点链和哈希链;本发明根据树中结点的编码不同共设置了 100个哈希链,编码相同的结点链 接在同一个哈希链中。哈希链的首指针存放在数组haShlink[100]中,haShlink
haShlink[99]分别存放哈希值为0 99的链首指针,初始状态各哈希链尚未建立,因此,设 置hashlinkR] = NULL,0彡k < 100。哈希链中每个结点包含5类数据域name 事件类型名count 情节计数tq:时间戳队列next 指向哈希链中下一个结点的指针psame 指向相同结点链链首结点的指针本发明中,将情节树中事件类型、计数和时间戳队列都相同的结点称为相同结点, 同事件类型的所有相同结点相互连接形成相同结点链。情节树中根据事件类型不同,可能 存在多条相同结点链。函数GenModLinkke)的执行流程如图3所示,具体说明如下(14. 1)将标志变量flag置0 ;变量flag标志着与ce相应的相同结点链是否已经建立,flag = 0表示该链尚未 建立;flag = 1表示该链已经建立。因最初不存在任何相同结点链,因此,该步骤将变量flag设置为0。(14. 2)判断是否已经存在ce的哈希链,即判断hashlinktce. tqcode]的值是否为 “NULL”,如果为空,表示ce的哈希链尚未建立,则进入步骤(14. 3),否则转入步骤(14.4);(14. 3)申请一个哈希链结点 node,并令 hashlink[ce. tqcode] = node,建立相应 的哈希链,转入步骤(14.6);(14.4)判断ce的信息是否已在相应的哈希链中,如果已在链中,则转入步骤 (14.7);否则,进入步骤(14.5);(14. 5)在哈希链尾追加新结点node ;(14. 6)结点 node 的各个域赋值,具体为:node. name = ce. name ;node, count =ce. count ;node, tq = ce. tq ;node, next = NULL ;node, psame = ce ;然后函数 GenModLink(ce)返回,此时,函数返回值为flag = 0 ;(14. 7)将ce追加到相应的相同结点链尾;(14.8)将标志变量flag置1,然后函数GenModLinkke)返回,此时,函数返回值 为 flag = 1。
(15)若函数GenModLink (ce)的返回值为1,则表示ce的相同结点链已经存在,ce 无需进一步延伸生成它的子结点,则转入步骤(17);否则,表示尚不存在ce的相同结点链, 则进入步骤(16);(16)将ce赋值给fe作为父结点,并调用子过程GenChilcKfe)生成fe的子结点;子过程GenChilcKfe)生成fe的子结点的过程就是对fe结点不断延伸,生成所有 以fe为后缀的高阶情节结点的过程,包括横向延伸和纵向延伸两种。横向延伸是fe在宽 度上的延伸,主要基于fe所表示的情节和以fe为尾事件的频繁2-情节进行;纵向延伸是 fe在深度上的延伸,通过递归调用子过程GenChilcKfe)实现。子过程GenChild(fe)的执 行流程如图4所示,具体说明如下(16. 1)横向延伸编号hi初始化为1 ;(16.2)判断fe是否横向延伸完毕,即判断是否hi >η,η是事件序列中事件类 型的数量。若hi >η,则转入步骤(16. 12);否则,说明尚未完成fe的横向延伸,进入步骤 (16. 3)继续进行横向延伸;(16. 3)判断以fe为尾事件的2_情节ehi-fe是否频繁,若频繁,则进入步骤 (16.4);否则,转入步骤(16. 11);(16. 4)取 fe. name 的事件类型编号 m,调用函数 EpiExtend (fe. tq,ep_2 [hi] [m], tq)对fe进行横向延伸;函数 EpiExtend (tql,tq2)的输入参数 tql = fe. tq, tq2 =印_2 [hi] [m] · tq,分 别为fe所表示的情节的时间戳队列和2-情节ehi-fe的时间戳队列,通过对二者进行比较 实现fe的横向延伸,产生其延伸情节,并生成延伸计数和延伸时间戳队列作为函数输出。设k-情节(k ^ 2) EPl = e\-e\ -Λ -e\, 2-情节 = ef - e22,若 e22 = e;,则 EPl 和 EP2的延伸情节,即k+1情节=彳-ei -Λ -e\。若EP的延伸计数ext_count彡min_ sup,则说明EP是频繁的,结点fe需要建立子结点。函数EpiExtend(tql,tq2)的执行流程如图5所示,具体说明如下(16. 4. 1)相关变量初始化,包括延伸计数ext_COunt初始化为0 ;tq2、tql队列 的索引P、q初始化为0 ;延伸时间戳队列ext_tq初始化为空;(16.4.2)判断tql或tq2是否已到尾部,若未到尾部,则进入步骤(16.4.3);否 则,从函数EpiExtend(tq 1,tq2)中返回;(16.4.3)比较 tq2[p]与 tql [q],若 tq2 [ρ]彡 tql [q],则进入步骤(16.4.4);否 则,转入步骤(16.4.5);(16. 4. 4) tql队列索引q加1,重复执行步骤(16.4.3);(16. 4. 5)延伸计数 ext_count 加 1,tq2 队列索引 ρ 加 1 ;(16.4.6)比较 tq2[p]与 tql[q],若 tq2[p] < tql [q],则进入步骤(16. 4. 7);否 则,转入步骤(16.4.8);(16. 4. 7)tq2队列索引ρ加1,重复执行步骤(16. 4. 6);(16. 4. 8)将tq2 [p_l]追加到延伸时间戳队列ext_tq的尾部,转入步骤 (16. 4. 2)。(16. 5)判断延伸情节是否频繁,即是否有延伸计数eXt_Coimt彡min_sup,若频 繁,则进入步骤(16.6);否则,转入步骤(16. 11);
11
(16.6)在树中建立 fe 的子结点 ce,并设置 ce. name = ehi ;ce. count = ext_ count ;ce.tq = ext_tq ;ce.next = NULL ;ce.samenext = NULL ;(16. 7)按照步骤(13)的编码公式对ce. tq进行编码;(16. 8)调用函数GenModLink (ce)建立或修改ce的相同结点链和哈希链; GenModLink(ce)的具体执行步骤见(14. 1)-(14. 8);(16.9)若函数GenModLink(Ce)的返回值为1,则ce无需再进行纵向延伸,转入步 骤(16. 11);否则,进入步骤(16. 10);(16. 10)将ce赋值给fe,递归调用过程GenChild (fe)生成fe的子结点实现纵向 延伸;(16. 11)横向延伸编号hi加1,转入步骤(16. 2);(16. 12)返回fe的父结点,赋值给fe ;其横向延伸编号赋值给变量hi ;(16. 13)判断fe是否为1_情节结点,如果不是,则进入步骤(16. 14);如果fe是 1-情节结点,表示fe的所有延伸都已完成,以fe为后缀的所有频繁情节都已生成,因此,子 过程GenChiId (fe)执行结束。(16.14)递归调用子过程GenChilcKfe),并将横向延伸编号hi加1,转入步骤 (16. 2)。(17)子结点编号i增1,转入步骤(10);(18)判断事件队列queue是否已取到尾,若已取到尾,表示已经建立完整的情节 树,事件序列上所有的频繁情节都已挖掘出来并存储在树中,则转入步骤OO);否则,进入 步骤(19);(19) queue队列的索引j加1,转入步骤(8),继续挖掘以queue [j] · name为后缀的 频繁情节;(20)根据情节树中存储的情节语义进行情节输出。根据树所表示的情节语义,树中每个结点代表由其自身到1-情节结点所在分支 构成的频繁情节,因此,树中每个非1-情节结点到1-情节结点经过的路径便构成了全部的 频繁情节。具体输出时,非1-情节结点分为两种情况,每种情况的情节输出过程如下①非1-情节结点是相同结点链中的首结点此种情况下,由非1-情节结点到1-情节结点路径上的每个结点都是由上层结点 延伸生成,因此,直接输出路径上的结点即可,即由高层结点作为情节首结点,路径上的结 点按照由高层到低层的顺序依次作为中间节点,路径上的1-情节结点作为尾结点进行情 节输出。②非1-情节结点是相同结点链中的非首结点此种情况下,非1-情节结点向其子结点的延伸过程由于建立相同结点链而被省 略,它将与相同结点链上的其它结点共享相同的子结点,因此,该非1-情节结点到1-情节 结点路径上所包含的结点只能构成部分频繁情节,另一部分频繁情节需要借助相同结点链 生成。为此,需要定位相同结点链的链首,具体定位方法为设非1-情节结点为nodel,则按照nodel. name查找哈希链hashlink[nodel. tqcode],设找到的哈希结点为n0de2,则n0de2. psame所指向的就是nodel所在相同结点链 的链首结点。
情节输出路径包含两部分,一部分路径由链首结点的所有子结点按照由高层到低 层的顺序构成,另一部分路径由链首结点到ι-情节的路径构成。完整路径中的所有结点都 代表了相应的频繁情节,可分别进行输出。使用本发明方法在大量的数据上进行了测试,验证了其与传统类Apriori方法相 比在时间和空间性能上的优势。以下是其中的一个实例。测试的硬件环境=CPU为INTEL 2. 66GHz,内存为3. 5GB的PC机。软件环境操作系统为Windows XP Professional 2002,开发语言为Visual C++6. 0。测试数据来自Intel伯克利实验室布置的讨个无线传感器从2004年2月观日 至 2004年 4 月 5 日产生的数据(http://db. csail.mit. edu/labdata/labdata. html),每个 事件包含传感器编号、时间戳、温度等属性。测试时从中选出27个传感器,并将温度属性值 分为4个区间,形成了 27*4 = 108个事件类型,事件序列长度最多包含10万个事件。测试方案和结果本发明从以下两个方面对所提出的方法进行了测试。①对于固定长度的事件序列,分别设定不同的频繁数阈值,测试本发明方法的挖 掘时间,并与传统的类Apriori方法的挖掘时间进行比较;从上面的步骤描述中可以看出,在情节挖掘过程中,一直使用频繁数阈值min-sup 来衡量情节的频繁性。由于事件序列较长,频繁数阈值min-sup取值较大,为了表达方便, 在以下的结果描述中将频繁数阈值min-sup折算为频繁度阈值min_fre,折算方法是min_fre = min_sup/len_seq其中,len_seq是事件序列长度。下表给出了挖掘时间随频繁度阈值min_fre的变化情况
权利要求
1.一种基于相同结点链和哈希链的事件序列频繁情节挖掘方法,包括以下步骤(1)对相关数据结构进行初始化,包括①将事件序列中包含的事件类型按照自然数递增的顺序进行编码;②对包含1-情节信息的结构数组印1_1中的count和time域进行初始化;③对包含2-情节信息的情节矩阵进行初始化;(2)判断事件序列是否已扫描完,若已扫描完,则转入步骤(6);否则进入步骤(3);(3)在事件序列上读取扫描事件(e,t);(4)将事件类型e的发生计数加1,发生的时间戳t记录在相应的印1_1数组元素中;(5)调用函数GenMinOcc(e, t),生成与事件(e,t)相关的2-情节的最小发生信息并记 录在情节矩阵中,转入步骤O);(6)在数组epi_l中选择频繁的1-情节,并将其按照发生计数降序排列,形成事件队 列 queue ;(7)将queue队列索引j赋值为1;(8)在情节树中建立根的子结点ce,取queue[j]的相关信息赋值给ce的相关数据域, 并将ce赋值给fe作为进一步延伸的父结点;(9)子结点编号i赋值为1;(10)如果fe已延伸完毕,建立了所有的子结点,即i>n(η为事件序列中包含的事件类 型的数量),则转入步骤(18);否则进入步骤(11);(11)判断2-情节ei-fe.name是否频繁,若频繁,则进入步骤(12);否则,转入步骤 (17);(12)在树中建立fe的子结点ce,并将2_情节ei-fe.name的相关信息赋值给ce的相 关数据域;(13)对ce的时间戳队列进行编码;设时间戳队列讨=(、t2,…,、),则其编码tqcode为
2.根据权利要求1所述的方法,其特征在于步骤⑶中所述调用子过程 GenMinOcc (e, t)的执行流程为(5. 1)情节矩阵的行索引r初始化为1,取事件类型e的编码m ; (5.2)判断是否所有的矩阵行都已处理完,若处理完,则转入步骤(5.8);否则,进入 步骤(5. 3);(5. 3)判断矩阵元素[er, e]的修改状态是否为“可修改”,即判断epi_2[r] [m], state 的值是否等于“0”,若是,则进入步骤(5.4);否则转入步骤(5.7);(5. 4) 2-情节er-e的发生计数加1,即执行epi_2[r] [m], count++ ;(5. 5)将时间戳t追加到时间戳队列epi_2[r] [m].tq的尾部;(5. 6)将矩阵元素[er, e]的状态设置为“不可修改”,即执行epi_2 [r] [m] · State=I ;(5.7)行索引r加1,转入步骤(5. 2);(5. 8)情节矩阵的列索引c初始化为1 ;(5.9)判断是否所有的矩阵列都已处理完,若处理完,则从GenMinOcc(e,t)中返回; 否则,进入步骤(5. 10);(5.10)判断矩阵元素[e,ej的修改状态是否为“不可修改”,即判断印1_2[m] [c]. state的值是否为“1”,若是,则进入步骤(5. 11);否则转入步骤(5. 12);(5.11)将矩阵元素[e,ej的状态设置为“可修改”,即执行印1_2 [m] [c]. State=O ; (5. 12)列索引c加1,转入步骤(5. 9)。
3.根据权利要求1所述的方法,其特征在于步骤(14)中所述调用函数 GenModLink(ce)的执行流程为(14. 1)将标志变量flag置0 ;(14.2)判断是否已经存在ce的哈希链,即判断hashlinktce.tqcode]的值是否为 “NULL”,如果为空,表示ce的哈希链尚未建立,则进入步骤(14. 3),否则转入步骤(14.4);(14. 3)申请一个哈希链结点node,并令hashlink[ce. tqcode] =node,建立相应的哈 希链,转入步骤(14.6);(14.4)判断ce的信息是否已在相应的哈希链中,如果已在链中,则转入步骤(14.7); 否则,进入步骤(14.5);(14. 5)在哈希链尾追加新结点node ;(14. 6) 结点 node 的各个域赋值,具体为node. name=ce. name ; node, count= ce. count ; node. tq=ce. tq; node. next=NULL; node. psame=ce;然后函数GenModLink(ce) 返回,此时,函数返回值为flag=0 ;(14.7)将ce追加到相应的相同结点链尾;(14.8)将标志变量flag置1,然后函数GenModLink(Ce)返回,此时,函数返回值为 f Iag=I ο
4.根据权利要求1所述的方法,其特征在于步骤(16)中所述调用子过程 GenChiId (fe)的执行流程为(16. 1)横向延伸编号hi初始化为1 ;(16. 2)判断fe是否横向延伸完毕,即判断是否hi>n,η是事件序列中事件类型的数 量,若hi>n,则转入步骤(16. 12);否则,进入步骤(16.3)继续进行横向延伸;(16.3)判断以fe为尾事件的2-情节e^-fe是否频繁,若频繁,则进入步骤(16.4); 否则,转入步骤(16. 11);(16. 4)取 fe. name 的事件类型编号 m,调用函数 EpiExtend (fe. tq, ep_2 [hi] [m]. tq) 对fe进行横向延伸;(16. 5)判断延伸情节是否频繁,即是否有延伸计数eXt_COimt彡min_SUp,若频繁,则 进入步骤(16.6);否则,转入步骤(16. 11);(16. 6)在树中建立 fe 的子结点 ce,并设置 ce. name=ehi ;ce. count=ext_count ; ce. tq=ext_tq ;ce. next=NULL ;ce.samenext= NULL ;(16. 7)按照步骤(13)的编码公式对ce. tq进行编码;(16. 8)调用函数GenModLink (ce)建立或修改ce的相同结点链和哈希链; GenModLink(ce)的具体执行步骤按(14. 1)-(14. 8)进行;(16.9)若函数GenModLink(Ce)的返回值为1,则ce无需再进行纵向延伸,转入步骤 (16. 11);否则,进入步骤(16. 10);(16. 10)将ce赋值给fe,递归调用过程GenChild (fe)生成fe的子结点实现纵向延伸;(16. 11)横向延伸编号hi加1,转入步骤(16. 2); (16. 12)返回fe的父结点,赋值给fe ;其横向延伸编号赋值给变量hi ; (16.13)判断fe是否为1-情节结点,如果不是,则进入步骤(16. 14);如果fe是1_情 节结点,子过程GenChilcKfe)执行结束;(16. 14)递归调用子过程GenChilcKfe),并将横向延伸编号hi加1,转入步骤(16. 2)。
5.根据权利要求4所述的方法,其特征在于步骤(16. 4)中所述调用函数 EpiExtend (tql,tq2)的执行流程为(16. 4. 1)相关变量初始化,包括延伸计数eXt_COimt初始化为O ;tq2、tql队列的索 引P、q初始化为O ;延伸时间戳队列ext_tq初始化为空;(16.4.2)判断tql或tq2是否已到尾部,若未到尾部,则进入步骤(16.4.3);否则,从 函数 EpiExtend (tql, tq2)中返回;(16.4.3)比较tq2[p]与 tql [q],若 tq2 [ρ]彡 tql [q],则进入步骤(16.4.4);否则, 转入步骤(16. 4. 5);(16.4.4)tql队列索引q加1,重复执行步骤(16.4.3); (16. 4. 5)延伸计数ext_count加1,tq2队列索引ρ加1 ;(16.4.6)比较 tq2[p]与 tql [q],若 tq2 [ρ] <tql [q],则进入步骤(16.4.7);否则,转 入步骤(16. 4. 8);(16. 4. 7) tq2队列索引ρ加1,重复执行步骤(16. 4. 6);(16. 4. 8)将tq2[p-l]追加到延伸时间戳队列ext_tq的尾部,转入步骤(16. 4. 2)。
全文摘要
本发明提供了一种事件序列上挖掘最小发生频繁情节的方法,通过对低阶频繁情节进行逐级的延伸直接生成高阶频繁情节。本发明提供的发现情节的最小发生并对其进行计数的方法,通过建立情节矩阵并在矩阵元素上设置相应的修改状态发现2-情节的最小发生并实现计数,通过对频繁的2-情节进行基于时间戳队列的延伸来发现k-情节(k>2)的最小发生并实现计数。本发明提供的基于相同结点链和哈希链建立情节树的情节挖掘方法,节省了情节延伸的时间和所占用的内存空间,在挖掘过程中,只需扫描数据一次,无需生成候选情节集合,挖掘效率高,占用内存空间少,并具有挖掘时间成本不随频繁数阈值明显变化的良好特性,可被扩展到事件流上的情节挖掘。
文档编号G06F17/30GK102073732SQ20111002015
公开日2011年5月25日 申请日期2011年1月18日 优先权日2011年1月18日
发明者乔建忠, 林树宽 申请人:东北大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1