一种挖掘事务数据流上最近时间窗口内频繁模式的方法转让专利

申请号 : CN200710053156.6

文献号 : CN101119302B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李国徽陈辉杨兵陈基雄

申请人 : 华中科技大学

摘要 :

一种挖掘事务数据流上最近时间窗口内频繁模式的方法,采用前缀模式复用方式的频繁模式树压缩存储数据流上最近时间窗口内的频繁模式,当流数据到达时,所包含的模式信息增量更新到频繁模式树上;同时应用时间衰减模型对历史事务数据所包含的模式支持数进行衰减,并据此将新近产生事务数据的模式同历史事务数据的模式区分开来,凸现出新事务模式的重要性;当用户提交模式查询时,该发明的方法能够立即响应查询,并输出数据流上最近的频繁模式。该方法与其它方法相比,具有响应时间快、模式挖掘的时间粒度精细等优点,同时可以根据需要来确保模式挖掘的覆盖率或者精度。

权利要求 :

1.一种挖掘事务数据流上最近时间窗口内频繁模式的方法,其步骤包括:(1)根据用户输入的用户支持度门限θ与用户许可误差ε确定流数据窗口大小N与衰减因子f, f等于f1或f2,其中,式中,用户支持度门限θ的取值范围为(0,1),用户许可误差ε的取值范围为(0,θ);

(2)选定全序<的排序规则;

(3)开辟频繁模式树的存储区和流数据缓存队列的存储区,并初始化频繁模式树与流数据缓存队列;其中,频繁模式树用于动态存储数据流上最近时间窗口内的频繁模式,频繁模式树由模式树与频繁数据项表两部分组成;

模式树上每一个节点都包括节点名称、指向孩子节点的指针、指向兄弟节点的指针、活动数据窗口内的支持数、固定数据窗口内的支持数、包含该节点的最近事务ID的节点时间戳、指向同名节点的指针;

频繁数据项表中的每一数据表项都由数据项名称和指向前缀模式树上第一个同名节点的指针两个数据域组成;

模式树的每一个分枝上的节点及频繁数据项表上的数据表项均按照全序<排列;

(4)当数据流连续到达时,根据流数据到达的顺序将其添加到流数据缓存队列中,并根据流数据窗口大小N对缓存队列中的流数据进行分段;

(5)判断是否存在用户查询请求,如果存在,则转入步骤(10),否则,进入步骤(6);

(6)从缓存队列的头部提取流数据T,同时将T从缓存队列中删除;设流数据T=,且流数据T到达的时间戳记为tID;

(7)定义一个频繁模式树树节点的指针变量cur_Node,并设置cur_Node指向频繁模式树的根结点,然后将流数据T所包含的模式信息增量更新至频繁模式树上;

(8)判断流数据T是否为活动数据窗口中最后一个数据元素,如果是,则进入步骤(9),否则转入步骤(5);

(9)从频繁数据项表的头部开始依次读取频繁数据项,并根据该频繁数据项的指针查找频繁模式树上的同名节点,如果该节点的时间戳距当前时刻大于2N,则删除以该节点为根的子树,否则令该节点在固定数据窗口内的支持数等于其在活动数据窗口内的支持数,同时将活动数据窗口内的支持数置零;

(10)从频繁数据项表的尾部开始逆序读取频繁数据项,并计算该频繁数据项的支持度,如果其支持度大于等于θ与ε差,则采用模式增长的方法输出所有包含该频繁数据项的频繁模式。

2.根据权利要求1所述的方法,其特征在于:上述步骤(7)按照下述过程将流数据T所包含的模式信息增量更新至频繁模式树上:(7.1)将流数据T中的数据元素按照全序<排列,记排列后的数据序列为T’=

(7.2)从T’中读取第一个数据元素,并赋值给aj’;

(7.3)如果aj’不为空,则进入步骤(7.4),否则转到步骤(7.10);

(7.4)从指针cur_Node所指向节点的所有孩子节点中查找与aj’同名的树节点,如果找到符合条件的节点,则进入步骤(7.5),否则转入步骤(7.7);

(7.5)记查找到的与aj’同名的树节点为t_node;

(7.6)分别按照下式更新节点t_node的CCount计数器与时间戳TID,然后转入步骤(7.8);

(TtID-t_node.TID)

t_node.CCount=t_node.CCount×f +1t_node.TID=T.tID

(7.7)插入一个与aj’同名的新的树节点t_node至频繁模式树;

(7.8)设置cur_Node=t_node;

(7.9)从T’中读取下一个数据元素并赋值给aj’,转到步骤(7.3);

(7.10)更新结束。

3.根据权利要求2所述的方法,其特征在于:上述步骤(7.7)按照下述过程将与aj’同名的新的树节点插入至频繁模式树:(7.7.1)创建一个新的频繁模式树树节点t_node,并设置t_node.name=aj’,t_node.TID=T.tID,t_node.CCount=1,t_node.LCount=0;

(7.7.2)将树节点t_node插入到频繁模式树上,使其成为cur_Node的孩子节点;

(7.7.3)在频繁数据项表中查找与aj’同名的数据表项e,如果查找失败,进入步骤(7.7.4),否则转入(7.7.6);

(7.7.4)创建一个新的频繁数据项表的数据表项e,设置e.item=aj’;

(7.7.5)将数据表项e插入到频繁数据项表中,并保持频繁数据项表中所有数据表项按照全序<有序;

(7.7.6)判断数据表项e的域e.pHLink是否为空;如果是,则进入步骤(7.7.7),否则,则转入步骤(7.7.8);

(7.7.7)设置e.pHLink=t_node;然后转入步骤(7.7.13);

(7.7.8)定义一个频繁模式树树节点的指针变量tmp_node;

(7.7.9)赋值tmp_node=e.pHLink;

(7.7.10)判断tmp_node->pNSibling是否为空,如果不为空,则进入步骤(7.7.11),否则转入步骤(7.7.12);

(7.7.11)赋值指针变量tmp_node->pNSibling=t_node;

(7.7.12)赋值指针变量tmp_node=tmp_node->pNSibling,并转入步骤(7.7.10)继续执行;

(7.7.13)插入与aj’同名的树节点结束。

4.根据权利要求1、2或3所述的方法,其特征在于:所述步骤(9)按照下述过程对频繁模式树进行剪枝:(9.1)从频繁数据项表的头部开始依次选取数据表项e;

(9.2)定义一个频繁模式树树节点的指针变量node;

(9.3)赋值node=e.pHLink;

(9.4)判断指针node所指向树节点的时间戳与当前流数据T的时间戳之间的时间间隔是否大于2N,如果是,则进入步骤(9.5),否则转入步骤(9.6)(9.5)删除以node所指树节点为根的子树,然后转入步骤(9.7);

(9.6)设置node->LCount=node->CCount,node->CCount=0;

(9.7)设置node=tmp_node->pNSibling;

(9.8)判断指针变量node是否为null,如果是,则进入步骤(9.9),否则转入步骤(9.4);

(9.9)判断e.pHLink是否为null,如果是,则进入步骤(9.10),否则转入步骤(9.11)(9.10)将数据表项e从频繁数据项表中删除;

(9.11)判断是否到达频繁数据项表的尾部,如果是,则转入步骤(9.14);否则进入步骤(9.12);

(9.12)从频繁数据项表中提取数据表项e的下一个数据表项e’;

(9.13)赋值e=e’,并转入步骤(9.2);

(9.14)剪枝结束。

5.根据权利要求1、2或3所述的方法,其特征在于:步骤(10)按照下述过程从频繁模式树上输出最近的频繁模式:(10.1)从频繁数据项表的底部开始依次读取数据表项e;

(10.2)按照下式计算频繁模式树上所有与数据表项e同名的树节点的支持数freq(e);

式中,nodei表示频繁模式树中与数据表项e同名的一个树节点,其中i表示nodei在频繁模式树上所有与数据表项e同名的树节点集合中的序号;

(10.3)如果freq(e)≥(θ-ε)N,则进入步骤(10.4),否则转入步骤(10.5);

(10.4)使用模式增长方法从频繁模式树上输出所有包含与数据表项e同名数据元素的频繁模式;

(10.5)判断是否到达频繁数据项表的头部,如果是,则转入步骤(10.8),否则进入步骤(10.6);

(10.6)从频繁数据项表中读取数据表项e的下一个数据表项e’;

(10.7)赋值e=e’,然后转入步骤(10.2);

(10.8)结束。

6.根据权利要求4所述的方法,其特征在于:步骤(10)按照下述过程从频繁模式树上输出最近的频繁模式:(10.1)从频繁数据项表的底部开始依次读取数据表项e;

(10.2)按照下式计算频繁模式树上所有与数据表项e同名的树节点的支持数freq(e);

式中,nodei表示频繁模式树中与数据表项e同名的一个树节点,其中i表示nodei在频繁模式树上所有与数据表项e同名的树节点集合中的序号;

(10.3)如果freq(e)≥(θ-ε)N,则进入步骤(10.4),否则转入步骤(10.5);

(10.4)使用模式增长方法从频繁模式树上输出所有包含与数据表项e同名数据元素的频繁模式;

(10.5)判断是否到达频繁数据项表的头部,如果是,则转入步骤(10.8),否则进入步骤(10.6);

(10.6)从频繁数据项表中读取数据表项e的下一个数据表项e’;

(10.7)赋值e=e’,然后转入步骤(10.2);

(10.8)结束。

说明书 :

一种挖掘事务数据流上最近时间窗口内频繁模式的方法

技术领域

[0001] 本发明属于时态数据挖掘技术,具体涉及一种挖掘事务数据流上最近时间窗口内频繁模式的方法及系统。

背景技术

[0002] 数据流是一类由高速到达的数据元素组成的无界数据序列。近年来,数据流广泛出现在各类应用中,例如:网络流量监控、金融数据管理、传感器网络数据管理、Web日志分析、移动对象数据管理、通信数据分析以及大型零售商业中交易日志管理。在这类应用中,发现事务数据流中的频繁模式具有重要的意义,例如:在网络流量监控中,对应于异常流量的频繁报文可能意味着存在网络攻击;在大量的零售销售记录中,频繁商品及其组合总是对应热门销售的商品以及它们之间的关联关系;在传感器网络数据管理中,发现传感器数据中的频繁模式可以有助于去估计那些丢失的数据值。
[0003] 目前,大多数方法都是将传统的静态事务数据库频繁模式挖掘方法推广使用到数据流环境下。这些方法将滑动窗口模型应到数据流环境上,并将滑动窗口内的数据元素看作是静态数据集,并以此为处理的对象,使用传统的频繁模式挖掘方法来得到数据流各个分段上的频繁模式,进而获得数据流全局的频繁模式。这些方法中,数据的处理需要等待窗口内的数据积累,因此,响应用户查询请求的时间粒度比较粗糙,不能及时满足那些时间敏感的用户查询需要。
[0004] 此外,大多数方法都没有将数据流上最近的频繁模式与历史上的频繁模式区分开来。然而对绝大多数应用而言,发现数据最近的频繁模式具有更加重要的意义。例如:在大型零售销售日志中,最近频繁的模式代表最近热门销售商品,它可以指导销售商及时调整营销策略和进行商品库存调整。而历史的频繁模式仅仅能说明商品销售的历史信息。因此在频繁模式挖掘中,非常有必要区分最近的频繁模式与历史的频繁模式的权重,为应用中的决策提供正确的支持。
[0005] J.H.Chang 等 人 (“Finding recently frequent itemsets adaptively overonline transactional data streams”,information system,volume 31,issue 8,2006)提出了一种在线挖掘事务数据流最近的频繁模式的方法,该方法与本发明最为接近。
该方法使用字典树动态维护数据流上最近的频繁模式,并采用时间衰减模型逐步衰减历史事务模式的支持数,由此区分历史事务的模式与最近产生的事务的模式;此外,该方法定期对字典树进行剪枝,使字典树上仅仅保存着数据流上最近的频繁模式。当用户提交查询请求时,该方法能够从字典树上输出数据流上最近的频繁模式。尽管如此,该方法还是存在如下缺陷:(a)该方法中的字典树没能有效地利用储存空间,空间利用率低下。(b)该方法采用的启发式方法维护字典树;而启发式方法需要产生大量的中间候选模式,当更新一个长度为L的模式时,需要产生2L个候选模式,并需要执行2L次查找与更新操作,因此字典树维护代价大。(c)该方法需要额外的存储空间来维护那些在当前不频繁而在未来时刻可能频繁的模式的详细信息;而数据流上不频繁模式的数量极其庞大,维护这些不频繁模式的历史信息所需要的代价巨大。(d)该方法在进行字典树剪枝时,需要遍历字典树上所有路径上的树节点,效率比较低。

发明内容

[0006] 本发明的目的是提供一种挖掘事务数据流上最近时间窗口内频繁模式的方法,该方法具有存储空间的利用率高、无需产生中间候选模式、无需维护不频繁模式详细的历史信息、并能够在误差范围内有效地提高模式挖掘精度的特点。
[0007] 本发明提供的挖掘事务数据流上最近时间窗口内频繁模式的方法,其步骤包括:
[0008] (1)根据用户输入的用户支持度门限θ与用户许可误差ε确定流数据窗口大小N与衰减因子f, ,f等于f1或f2,其中,
[0009]
[0010]
[0011] 式中,用户支持度门限θ的取值范围为(0,1),用户许可误差ε的取值范围为(0,θ);
[0012] (2)选定全序<的排序规则;
[0013] (3)开辟频繁模式树的存储区和流数据缓存队列的存储区,并初始化频繁模式树与流数据缓存队列;其中,
[0014] 频繁模式树用于动态存储数据流上最近时间窗口内的频繁模式,频繁模式树由模式树与频繁数据项表两部分组成;
[0015] 模式树上每一个节点都包括节点名称、指向孩子节点的指针、指向兄弟节点的指针、活动数据窗口内的支持数、固定数据窗口内的支持数、包含该节点的最近事务ID的节点时间戳、指向同名下一个节点的指针;
[0016] 频繁数据项表中的每一数据表项都由数据项名称和指向前缀模式树上同名的第一个节点的指针两个数据域组成;
[0017] 模式树的每一个分枝上的节点及频繁数据项表上的数据表项均按照全序<排列;
[0018] (4)当数据流连续到达时,根据流数据到达的顺序将其添加到流数据缓存队列中,并根据流数据窗口大小N对缓存队列中的流数据进行分段;
[0019] (5)判断是否存在用户查询请求,如果存在,则转入步骤(10),否则,进入步骤(6);
[0020] (6)从缓存队列的头部提取流数据T,同时将T从缓存队列中删除;设流数据T=,且流数据T到达的时间戳记为tID;
[0021] (7)定义一个频繁模式树树节点的指针变量cur_Node,并设置cur_Node指向频繁模式树的根结点,然后将流数据T所包含的模式信息增量更新至频繁模式树上;
[0022] (8)判断流数据T是否为活动数据窗口中最后一个数据元素,如果是则进入步骤(9),否则转入步骤(5);
[0023] (9)从频繁数据项表的头部开始依次读取频繁数据项,并根据该频繁数据项的指针查找频繁模式树上的同名节点,如果该节点的时间戳距当前时刻大于2N,则删除以该节点为根的子树,否则令该节点在固定数据窗口内的支持数等于其在活动数据窗口内的支持数,同时将该节点在活动数据窗口内的支持数置零;
[0024] (10)从频繁数据项表的尾部开始逆序读取频繁数据项,并计算该频繁数据项的支持度,如果其支持度大于等于θ与ε差,则采用模式增长的方法输出所有包含该频繁数据项的频繁模式。
[0025] 与J.H.Chang等人的方法相比,本发明采用一种存储结构相对紧凑的树结构(频繁模式树)来压缩存储数据流上的频繁模式信息;并在不产生中间候选模式的前提下动态维护频繁模式树;当新的事务数据到达时,它所包含的模式直接增量更新到频繁模式树上,无需额外的存储空间来维护它们的历史信息;在频繁模式树剪枝时,仅仅需要遍历频繁模式树上的部分节点;此外,通过选取不同的衰减系数,本发明能够保证频繁模式挖掘的精度或者覆盖率。

附图说明

[0026] 图1为本发明方法的流程图;
[0027] 图2为频繁模式树存储结构图;
[0028] 图3为频繁模式树增量更新流程图;
[0029] 图4为向频繁模式树上插入新的树节点流程图;
[0030] 图5为频繁模式树快速剪枝流程图。

具体实施方式

[0031] 下面结合附图和实例对本发明作进一步详细的说明。
[0032] 如图1所示,本发明方法的步骤包括:
[0033] (1)根据用户输入的用户支持度门限θ与用户许可误差ε确定系统参数:流数据窗口大小N与衰减因子f。
[0034] 流数据窗口分为活动数据窗口和固定数据窗口两类:活动数据窗口表示正在接收流数据的流数据窗口,尽管窗口的存储容量为N,但窗口内实际保存的流数据元素的数量为L,且L≤N;固定数据窗口表示已经保存了N个流数据元素的流数据窗口。
[0035] 流数据窗口大小设置为 ;
[0036] 衰减系数f(0<f<1),f等于f1或f2,f1和f2取值区间由下式确定:
[0037]
[0038]
[0039] 式中,用户支持度门限θ的取值范围为(0,1),用户许可误差ε的取值范围为(0,θ);
[0040] 其中,衰减系数f1能满足模式挖掘结果的覆盖率为100%,而衰减系数f2能满足模式挖掘结果的精度为100%。
[0041] (2)选定全序<的排序规则,例如:按字典序排列。
[0042] (3)开辟系统存储区,包括:频繁模式树的存储区和流数据缓存队列的存储区;并初始化频繁模式树与流数据缓存队列。
[0043] 频繁模式树用于动态存储数据流上最近时间窗口内的频繁模式。频繁模式树由两部分组成:模式树与频繁数据项表f_list,其存储结构如图2所示。
[0044] 模式树上每一个节点都包括八个数据域:
[0045] Name:节点名称
[0046] pFChild:指向孩子节点的指针
[0047] pNSibling:指向兄弟节点的指针
[0048] CCount:活动数据窗口内的支持数
[0049] LCount:固定窗口内的支持数
[0050] TID:节点时间戳(包含该节点的最近事务ID)
[0051] pNLink:指向同名节点的指针。
[0052] 频繁数据项表f_list中的每一数据表项都由两个数据域组成:
[0053] Item:数据项名称
[0054] pHLink:指向前缀模式树上第一个同名节点的指针。
[0055] 模式树的每一个分枝上的节点及频繁数据项表上的数据表项均按照全序<排列。
[0056] (4)当数据流连续到达时,根据流数据到达的顺序将其添加到系统缓存队列中,并根据流数据窗口大小N对缓存队列中的流数据进行分段。
[0057] (5)判断是否存在用户查询请求,如果存在,则转入步骤(10),否则,进入步骤(6);
[0058] (6)从缓存队列的头部提取流数据T,同时将T从缓存队列中删除。流数据T=,且流数据T到达的时间戳记为tID;
[0059] (7)定义一个频繁模式树树节点的指针变量cur_Node,并设置cur_Node指向频繁模式树的根结点root;然后将流数据T所包含的模式信息增量更新至频繁模式树上,其步骤如流程图3所示,具体说明如下:
[0060] (7.1)将流数据T中的数据元素按照全序<排列,记排列后的数据序列为T’=
[0061] (7.2)从T’中读取第一个数据元素,并赋值给aj’。
[0062] (7.3)如果aj’不为空,则进入步骤(7.4),否则转到步骤(7.10)。
[0063] (7.4)从指针cur_Node所指向节点的所有孩子节点中查找与aj’同名的树节点。如果找到符合条件的节点,则进入步骤(7.5),否则转入步骤(7.7)。
[0064] (7.5)记查找到的与aj’同名的树节点为t_node;
[0065] (7.6)分别按照下式更新节点t_node的CCount计数器与时间戳TID,然后转入步骤(7.8);
[0066] t_node.CCo unt=t_node.CCo unt×f(T.tID-t_node.TID)+1
[0067] t_node.TID=T.tID
[0068] (7.7)插入一个与aj’同名的新的树节点至频繁模式树,其步骤如图4所示,具体说明如下:
[0069] (7.7.1)创建一个新的频繁模式树树节点t_node,并设置t_node.name=aj’,t_node.TID=T.tID,t_node.CCount=1,t_node.LCount=0;
[0070] (7.7.2)将树节点t_node插入到频繁模式树上,使其成为cur_Node的孩子节点;
[0071] (7.7.3)在频繁数据项表中查找与aj’同名的数据表项e,如果查找失败,进入步骤(7.7.4),否则转入(7.7.6);
[0072] (7.7.4)创建一个新的频繁数据项表的数据表项e,设置e.item=aj’;
[0073] (7.7.5)将数据表项e插入到频繁数据项表中,并保持频繁数据项表中所有数据表项按照全序<有序;
[0074] (7.7.6)判断数据表项e的域e.pHLink是否为空;如果是,则进入步骤(7.7.7),否则,则转入步骤(7.7.8);
[0075] (7.7.7)设置e.pHLink=t_node;然后转入步骤(7.7.13);
[0076] (7.7.8)定义一个频繁模式树树节点的指针变量tmp_node;
[0077] (7.7.9)赋值tmp_node=e.pHLink;
[0078] (7.7.10)判断tmp_node->pNSibling是否为空,如果不为空,则进入步骤(7.7.11),否则转入步骤(7.7.12);
[0079] (7.7.11)赋值指针变量tmp_node->pNSibling=t_node;
[0080] (7.7.12)赋值指针变量tmp_node=tmp_node->pNSibling,并转入步骤(7.7.10)继续执行;
[0081] (7.7.13)插入与aj’同名的树节点结束;
[0082] (7.8)设置cur_Node=t_node;
[0083] (7.9)从T’中读取下一个数据元素并赋值给aj’,转到步骤(7.3)。
[0084] (7.10)更新结束;
[0085] (8)判断流数据T是否为活动数据窗口中最后一个数据元素,如果是,则进入步骤(9),否则转入步骤(5);
[0086] (9)对频繁模式树进行剪枝;如图5所示,频繁模式树剪枝操作的详细步骤包括:
[0087] (9.1)从频繁数据项表的头部开始依次选取数据表项e;
[0088] (9.2)定义一个频繁模式树树节点的指针变量node;
[0089] (9.3)赋值node=e.pHLink;
[0090] (9.4)判断指针node所指向树节点的时间戳与当前流数据T的时间戳之间的时间间隔(T.tID-node->tID)是否大于2N,如果是,则进入步骤(9.5),否则转入步骤(9.6)[0091] (9.5)删除以node所指树节点为根的子树,然后转入步骤(9.7);
[0092] (9.6)设置node->LCount=node->CCount,node->CCount=0;
[0093] (9.7)设置node=tmp_node->pNSibling;
[0094] (9.8)判断指针变量node是否为null,如果是,则进入步骤(9.9),否则转入步骤(9.4);
[0095] (9.9)判断e.pHLink是否为null,如果是,则进入步骤(9.10),否则转入步骤(9.11)
[0096] (9.10)将数据表项e从频繁数据项表中删除;
[0097] (9.11)判断是否到达频繁数据项表的尾部,如果是,则转入步骤(9.14);否则进入步骤(9.12);
[0098] (9.12)从频繁数据项表中提取数据表项e的下一个数据表项e’;
[0099] (9.13)赋值e=e’,并转入步骤(9.2);
[0100] (9.14)剪枝结束
[0101] (10)从频繁模式树上输出最近的频繁模式。从频繁模式树上输出最近的频繁的操作步骤说明如下:
[0102] (10.1)从频繁数据项表的底部开始依次读取数据表项e;
[0103] (10.2)按照下式计算频繁模式树上所有与数据表项e同名的树节点的支持数freq(e);
[0104]
[0105] 式中,nodei表示频繁模式树中与数据表项e同名的一个树节点,其中i表示nodei在频繁模式树上所有与数据表项e同名的树节点集合中的序号;
[0106] (10.3)如果freq(e)≥(θ-ε)N,则进入步骤(10.4),否则转入步骤(10.5);
[0107] (10.4)使用模式增长方法(具体参见:J.Han,J.Pei,Y.Yin.“Miningfrequent patterns without candidate generation”.In the Proceedings of the 2000ACM SIGMOD International Conference of Management of Data,pages1-12.(2000)。)从频繁模式树上输出所有包含与数据表项e同名数据元素的频繁模式;
[0108] (10.5)判断是否到达频繁数据项表的头部,如果是,则转入步骤(10.8),否则进入步骤(10.6);
[0109] (10.6)从频繁数据项表中读取数据表项e的下一个数据表项e’;
[0110] (10.7)赋值e=e’,然后转入步骤(10.2);
[0111] (10.8)从频繁模式树上输出最近的频繁模式结束。
[0112] 实例:
[0113] 下面举例说明事务数据流上最近的频繁模式挖掘的方法。
[0114] 测试的硬件环境:CPU为INTEL 1.8GHz,内存为768MB。
[0115] 软件环境:Windows Server 2003,所有的功能模块使用Visual C++6.0实现。
[0116] 测试数据:IBM合成数据发生器(http://www.almaden.ibm.com/software/projects)生成的模拟顾客商场购物所产生的销售记录,测试数据假设商品的种类为10000种,平均顾客平均购买10件商品,顾客购买商品中热门销售的商品数量平均为4。
[0117] 测试方案:系统采用多线程的方式模拟事务数据流的频繁模式挖掘环境,进程A读取数据流中的事务数据并发送给系统的流数据接收处理模块;进程B负责接收流数据并进行数据分段;进程C执行频繁模式树的动态维护与频繁模式输出;
[0118] 首先,根据用户对频繁模式挖掘的要求预定义用户支持度门限和许可误差。例如,在一个包含10000个顾客的销售记录中,如果从中查找出至少同时有10个顾客购买过的商品或者它们的组合,则用户支持度门限θ设置为0.1%;由于在数据挖掘过程中可能存在一定的误差,如果也允许输出同时有9个顾客购买的商品,则选择选择用户许可误差ε为0.1×θ。
[0119] 选定用户支持度门限和许可误差之后,数据流上流数据窗口的大小N和时间衰减模型的衰减系数就可以确定。例如,根据上面的用户支持度门限θ和许可误差ε,可以确定:N=10000,保证模式挖掘覆盖率为100%的f取值范围为0.999895≤f≤1,保证模式挖掘精度为100%的f取值范围为0≤f≤0.9987。
[0120] 确定以上参数后,下面进行系统测试:
[0121] 进程A读取数据流上的事务数据,将其发送到测试系统;
[0122] 进程B接收到流数据,把它们加入到系统的缓存队列中,同时流数据窗口的大小对缓存队列中的流数据进行分段;
[0123] 在没有用户查询请求的情况下,进程C循环执行频繁模式树的增量更新操作,即每次从缓存队列中读取第一个流数据,将其所包含的模式信息增量更新到频繁模式树上;每处理完N个流数据时,执行频繁模式树的剪枝操作;
[0124] 当系统检测到用户查询请求后,进程C暂停频繁模式树的动态维护工作,转而从频繁模式树上输出频繁模式。
[0125] 测试性能结果说明如下:
[0126] (1)在处理大小为10000的数据窗口内事务数据的情况下,与J.H.Chang等人的方法进行对比,本发明能够将方法的时间性能提高35%左右,空间性能提高26%左右。
[0127] (2)下表为随衰减系数变化,模式挖掘结果的覆盖率与精度的变化结果。显然,当f=0.9994与f=1相比,同样能够保证模式挖掘的覆盖率为100%,而精度确有显著的提高;同样当f=0.9985同f取更小的值,在保证模式挖掘精度为100%的前提下,而覆盖率有显著的提高。
[0128]f 1 0.99970.99940.99910.99880.99850.99820.9979
覆盖率 100% 100% 100% 97% 92% 84% 75% 67%
精度 64% 76% 88% 95% 98% 100% 100% 1