一种分布式的趋同行为挖掘方法与系统与流程

文档序号:15492507发布日期:2018-09-21 20:54阅读:283来源:国知局

本发明涉及数据挖掘领域,特别涉及一种分布式趋的同行为挖掘方法与系统。



背景技术:

任何可以抽象成(对象,事件,时间,权重)四元组的数据都可以计算对象之间的趋同程度。其中“对象”是泛指,对应到具体的应用的时候,比如下文实施例中检测老鼠仓,它的“对象”便是“用户”。趋同行为挖掘(lockstepbehaviormining,lbm)的目标是:在给定某个对象的行为集合下,挖掘出数据库中对其趋同程度最高的对象,行为集合是指属于该对象的所有(事件,时间,权重)三元组。

如果每个对象将每个事件上的向量(时间是维度,每个维度上的值是权重)按顺序拼接成一个对象向量,每个对象向量长度均为|e|*|t|,这里的e是所有事件的集合,t是所有事件的时间集合。那么趋同行为挖掘的问题将被转化为一个受限制的最大化内积检索问题(maximuminnerproductsearch,mips):给定一个对象向量的集合s,以及一个待查询的对象向量q,在集合s中找一个对象向量p,使得p和q的内积最大,对象向量p就是要检索的结果。这里的限制是指查询的对象向量q的权重是0或1。因此只需把集合s中每个对象各自的权重加起来即可得出检索结果。

最大化内积检索问题是很多问题的核心。有些应用为了快速找到解,可以允许一定的误差,因此有近似的mips解。shrivastava,li,neyshaburandsrebro通过构造哈希函数使用局部敏感哈希方法(lsh)来求近似解,但在大维度数据集上,精度仍然很低。也有几种基于树的方法来解决mips问题,但基于树的方法在大维度数据集上并不实用。

趋同行为挖掘的问题虽然可以被转化为最大化内积检索问题,但有它自身的特点。

首先,在某些应用中,需要求它精确的解。例如:在金融领域中,如果用趋同行为去检测老鼠仓(rattrading),并且权重被设置为金额。那么要求解的应该是具体的趋同金额数值,该数值有可能作为量刑的依据,因此必须是一个精确的解,而非近似解。所以相关的lsh近似解法便不适用。

其次,趋同行为挖掘问题在大多数的应用中如果转化为最大化内积检索问题,数据将是稀疏的高维数据,因为每个对象向量维度将是|e|*|t|,这里的e是所有事件的集合,t是所有事件的时间集合。举例:在金融领域中,对象就是买卖股票的用户,事件为每支股票的买卖操作,至少有几千个事件;权重被设置为金额;时间粒度可以取大点,假设以天为粒度,至少有几千天。这样每个对象向量的维度至少是百万维。而这百万维的向量中,仅有几千或几万的维度是非零值,例如一个用户一天交易了10只股票,10年下来,也就几万条数据。这里每个维度是指某个时间的某个事件,也就是某天在某只股票上买,或者某天在某只股票上卖,维度上的值就是金额。如果是用相关的lsh近似解法,精度根本达不到要求,而现有的基于树的方法在大维度数据集上更不实用。

最后,趋同行为挖掘问题有个非常重要的特点。它的维度是时间维度,并且具有一定的连续性。现有的最大化内积检索方法都未考虑过此问题,这也是本发明能够做到快速求解的关键。

在进行老鼠仓行为挖掘算法的研究中,原有的算法使用sql语言在单机上进行实现,不仅算法复杂度高,而且无法分布式进行,导致效率低下,在数百亿的股票交易记录下进行一次老鼠仓行为挖掘,需要数天的时间,无法满足对老鼠仓行为的有效监督。

对相关的最大化内积检索算法进行研究后发现,大多数的最大化内积检索算法采用lsh求近似解,但其在高维稀疏的数据下,精度和效率都不能达到要求。而现有的基于树的方法在大维度数据集上更不实用,甚至不如lsh。



技术实现要素:

为了解决上述技术问题,本发明将问题泛化为趋同行为挖掘的问题。为解决该问题,本发明设计了一种基于分布式的趋同行为挖掘方法与系统,由分布式平台的内存计算框架先读取预先计算好的树索引,根据树索引对预存在分布式数据库中的相关数据记录进行读取,然后将所需的结果按对象进行合并,求取每个对象的趋同程度,并在计算框架上进行排序,保证了结果的正确性和高效性。

针对趋同行为挖掘的正确性和高效性要求,本发明设计了一种基于分布式的趋同行为挖掘方法与系统。基于spark的并行内存计算机制,代码易于实现和理解,能够方便地扩展至大规模集群中运行,改善了趋同行为挖掘存在的低效率问题。利用预设计的树结构索引,降低算法复杂度,提高数据读取效率,从算法角度改善了低效率问题。同时保证了高维稀疏数据下的正确性和高效性。

具体地说,本发明公开了一种分布式的趋同行为挖掘方法,其中包括:

步骤1、获取由四元组数据组成的数据集合,该四元组数据包括对象、事件、时间点和权重,将该数据集合按照事件类型划分为多个事件集合;

步骤2、为该事件集合构建索引树,根据该事件集合中的时间点确定该索引树的时间总长,根据线段树划分法将该时间总长拆分为时间段,该索引树的每个节点对应该时间段中每个对象的权重和,存储该索引树至分布式数据库;

步骤3、获取待查询对象的待查询事件和待查询时间段,在该分布式数据库查找与该待查询事件相对应的索引树,作为待查询索引树,在该待查询索引树中查询该待查询时间段中每个对象的该权重和,作为该待查询对象的趋同程度,选择该趋同程度最高的对象作为挖掘结果。

该分布式的趋同行为挖掘方法,其中该步骤2中的索引树构建过程、该步骤3中待查询索引树的查找过程以及趋同程度的计算过程均是在分布式平台的内存计算框架下完成的。

该分布式的趋同行为挖掘方法,其中该内存计算框架为spark框架。

该分布式的趋同行为挖掘方法,其中步骤2中的该线段树划分法包括:最优线段树法和平衡线段树法。

该分布式的趋同行为挖掘方法,其中该平衡线段树法采用二分存储时间段的方式构建该索引树;

该最优线段树法包括:

获取预设时间区间,按区间的右端点排序,合并相同的区间并计数;

统计当在时间点l断开时,有多少个以r为右端点的预设时间区间被断开,记为right(l,r);

根据right(l,r),统计当在时间点m断开,有多少个右端点小于r的区间被断开,记为cnt1(l,r,m);

按预设时间区间的左端点排序,合并相同的区间并计数;

统计当在时间点m断开时,有多少个以左端点为l且右端点大于等于r的区间断开,记为left(l,r,m);

根据left(l,r,m),统计当在时间点m断开,有多少个左端点大于l且右端点大于等于r的区间被断开,记为cnt2(l,r,m);

初始化cost数组为0,cost(l,r,m)=cnt1(l,r,m)+cnt2(l,r,m);

初始化dp数组为+∞,dp(i,i)=0;

dp(l,r)=min(dp(l,r),dp(l,m)+dp(m+1,r)+cost(l,r,m))

其中l≤m<r,相同dp值时选靠近中点的m值,dp(l,r)表示区间[l,r]拆分该预设时间区间的最少次数;

通过回溯该dp数组,以构建该索引树。

本发明还提出了一种分布式的趋同行为挖掘系统,其中包括:

事件划分模块,用于获取由四元组数据组成的数据集合,该四元组数据包括对象、事件、时间点和权重,将该数据集合按照事件类型划分为多个事件集合;

索引树构建模块,用于为该事件集合构建索引树,根据该事件集合中的时间点确定该索引树的时间总长,根据线段树划分法将该时间总长拆分为时间段,该索引树的每个节点对应该时间段中每个对象的权重和,存储该索引树至分布式数据库;

挖掘模块,用于获取待查询对象的待查询事件和待查询时间段,在该分布式数据库查找与该待查询事件相对应的索引树,作为待查询索引树,在该待查询索引树中查询该待查询时间段中每个对象的该权重和,作为该待查询对象的趋同程度,选择该趋同程度最高的对象作为挖掘结果。

该分布式的趋同行为挖掘系统,其中该索引树构建模块中的索引树构建过程、该挖掘模块中待查询索引树的查找过程以及趋同程度的计算过程均是在分布式平台的内存计算框架下完成的。

该分布式的趋同行为挖掘系统,其中该内存计算框架为spark框架。

该分布式的趋同行为挖掘系统,其中该线段树划分法包括:最优线段树法和平衡线段树法。

该分布式的趋同行为挖掘系统,其中该平衡线段树法采用二分存储时间段的方式构建该索引树;

该最优线段树法包括:

获取预设时间区间,按区间的右端点排序,合并相同的区间并计数;

统计当在时间点l断开时,有多少个以r为右端点的预设时间区间被断开,记为right(l,r);

根据right(l,r),统计当在时间点m断开,有多少个右端点小于r的区间被断开,记为cnt1(l,r,m);

按预设时间区间的左端点排序,合并相同的区间并计数;

统计当在时间点m断开时,有多少个以左端点为l且右端点大于等于r的区间断开,记为left(l,r,m);

根据left(l,r,m),统计当在时间点m断开,有多少个左端点大于l且右端点大于等于r的区间被断开,记为cnt2(l,r,m);

初始化cost数组为0,cost(l,r,m)=cnt1(l,r,m)+cnt2(l,r,m);

初始化dp数组为+∞,dp(i,i)=0;

dp(l,r)=min(dp(l,r),dp(l,m)+dp(m+1,r)+cost(l,r,m))

其中l≤m<r,相同dp值时选靠近中点的m值,dp(l,r)表示区间[l,r]拆分该预设时间区间的最少次数;

通过回溯该dp数组,以构建该索引树。

根据实验结果,本发明相较于单机sql版的算法有1至2个数量级的提升,相较于朴素的最大化内积检索方法有2至3个数量级的提升。部署到具体的老鼠仓检测应用环境中,耗时从原有的数天减少到现有的十分钟内。大大提高业务效率,减少用电能耗。

附图说明

图1为数据预处理和存储流程框图;

图2为平衡线段树示意图;

图3为本发明举例的最优线段树示意图;

图4为本发明实施例中生成的最优线段树示意图

图5为获取对象所涉及的所有事件的时间段集合图;

图6为趋同行为挖掘流程图。

具体实施方式

为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。

步骤1、数据预处理和存储流程。获取由四元组数据组成的数据集合,该四元组数据包括对象、事件、时间点和权重,统计该数据集合具有的事件类型,将该数据集合按照该事件类型划分为多个事件集合,该事件集合中的四元组数据均具有相同事件类型。

步骤2、为该事件集合构建索引树,根据该事件集合中最小时间点和最大时间点确定该索引树的时间总长,根据线段树法将该时间总长拆分为时间段,该索引树的每个节点对应该时间段中每个对象的权重和,存储该索引树至分布式数据库。

图1给出了数据预处理和存储的流程框图。在分布式平台的内存计算框架spark下对四元组数据集合按事件(例如相同事件)进行划分,每个事件的四元组数据集合构建一颗索引树,索引树的每个节点对应了该事件下的某个时间段每个对象的权重和。索引树以及每个节点的数据存储到分布式数据库hbase中,以供查询使用。需要注意的是,本发明也可基于别的计算框架,但在本实施例中仅以spark框架为例。每个事件会有很多时间点,可以设置时间段,把该时间段内的时间点的数据都放进去。把所有对象的数据都拿来建立索引,方便后面搜索用。该事件下,如果有个对象它在某个时间段内有权重,那么这个对象在这个时间段下就会有个权重和,权重和就是上面说的时间段下的所有时间点的权重之和。每一个节点对应一个权重和,这样建立索引树后,通过查询就可以得到某个事件下某个对象的某个时间段的权重和,而不需要再计算。

其中apachespark是一个开源集群运算框架,最初是由加州大学柏克莱分校amplab所开发。相对于hadoop的mapreduce会在运行完工作后将中介数据存放到磁盘中,spark使用了内存内运算技术,能在数据尚未写入硬盘时即在内存内分析运算。spark在内存内运行程序的运算速度能做到比hadoopmapreduce的运算速度快上100倍,即便是运行程序于硬盘时,spark也能快上10倍速度。

构建索引树流程。由于趋同行为挖掘任务在时间上具有一定的连续性,因此构建的索引树要支持查询某个时间段内的每个对象的权重和。可以通过线段树划分法划分时间段,包括事先预处理和存储每个时间段的数据,空间复杂度是o(n2),时间复杂度是o(1),将耗费大量硬盘空间;可以仅存储每个时间点的数据,空间和时间复杂度是o(n),速度太慢,不能满足需求;可以用平衡线段树的方法,二分存储时间段,如图2所示,空间复杂度是o(n),时间复杂度是o(log2(n));在已知一些频繁查询时间段的情况下,可以使用最优线段树的方法,如图3所示。给定一组查询时间区间(预设的时间段),构造一棵线段树(索引树),使得这组区间被拆分的总次数最少。求得的线段树即为最优线段树。其中查询时间区间是根据需要设定的,例如是是系统的使用者关心的时间区间,或者是经常需要被查询的时间区间。

举例,不给定已知查询时间区间时,采用平衡线段树的方法,二分存储时间段,时间区间总长为8的平衡线段树如图2所示。查询时间区间[4,8],将被拆分成[4,4]、[5,8],因此需要合并一次。给定已知查询时间区间[4,8],将构造出如图3所示的最优线段树,查询时间区间[4,8]时将不需要合并。

计算最优线段树的步骤如下:

1、对于输入的已知查询时间区间的总长,按右区间排序,合并相同的区间并计数;查询时间区间就是一系列的[l,r]区间,右区间指的就是r的值。排序就是根据这一系列的[l,r]的r值从小到大排序。计数指的是查询时间区间可能出现多个相同的[l,r]区间,计数就是计算每个[l,r]区间出现了多少次。排序是为了减少构建right数组的时间复杂度。

2、统计以点r为右端点(止点)的区间在点l处被拆分的个数,记为right(l,r);

3、根据right(l,r),计算右端点小于r的所有已知区间在[l,r]区间被点m拆分的个数,记为cnt1(l,r,m);

4、对于输入的已知查询时间区间,按左区间排序,合并相同的区间并计数;

5、计算以l为左端点且右端点大于等于r的区间在点m处被拆分的个数,记为left(l,r,m);

6、根据left(l,r,m),计算左端点大于l并且右端点大于等于r的所有已知区间在[l,r]区间被点m拆分的个数,记为cnt2(l,r,m);

7、初始化cost数组为0,cost(l,r,m)=cnt1(l,r,m)+cnt2(l,r,m),表示在所给定的已知区间下,在m点分割[l,r]这个区间将会使多少个已知区间在m点被拆分;

8、初始化dp数组为+∞,dp(i,i)=0

dp(l,r)=min(dp(l,r),dp(l,m)+dp(m+1,r)+cost(l,r,m))

其中l≤m<r,相同dp值时选靠近中点的m值,dp(l,r)表示在给定的已知区间情况下,区间[l,r]拆分这些已知区间的最少个数,i代表时间点。

举例,假设时间区间总长为4,已知两个查询时间区间[1,2]、[1,3]。首先计算得到right(1,2)、right(2,3)、right(1,3)都是1,其他为0。根据right数组,可计算得到cnt1(1,4,1)是2,cnt1(1,4,2)、cnt1(1,3,1)、cnt1(2,4,2)都是1,其他为0。再计算得到left(1,2,1)是2,left(1,3,1)、left(1,3,2)都是1,其他为0。根据left数组,可计算得到cnt2都为0。因此cost(1,4,1)是2,cost(1,4,2)、cost(1,3,1)、cost(2,4,2)都是1,其他为0。具体过程如下:

假设时间区间总长为4,已知两个查询时间区间[1,2]、[1,3]。那么我们需要计算right(1,2),right(1,3),right(2,3),right(1,4),right(2,4),right(3,4)。

right(1,2),即在点1断开,那么会有多少个以2为右端点的预设时间区间被断开,这里就一个,就是[1,2];

right(1,3),即在点1断开,那么会有多少个以3为右端点的预设时间区间被断开,这里就一个,就是[1,3];

right(2,3),即在点2断开,那么会有多少个以3为右端点的预设时间区间被断开,这里就一个,就是[1,3];

right(1,4),即在点1断开,那么会有多少个以4为右端点的预设时间区间被断开,因为预设时间区间的右端点未包含4,所以right(1,4)为0;同理right(2,4),right(3,4)也没有,就是0个。

有了right(l,r)之后计算cnt1(l,r,m):

cnt1(1,4,1),即在点1断开,那么会有多少个右端点小于4的预设时间区间被断开,也就是right(1,2)+right(1,3)=2;

cnt1(1,4,2),即在点2断开,那么会有多少个右端点小于4的预设时间区间被断开,也就是right(2,3)=1;

同理计算:

cnt1(1,3,1)=right(1,2)=1;

cnt1(2,4,2)=right(2,3)=1;

left(1,3,2),即在2点断开,那么会有多少个以左端点为1且右端点大于等于3的区间断开,有一个[1,3],其它同理去计算。

cnt2(1,4,2),即在点2断开,那么会有多少个左端点大于1且右端点大于等于4的区间被断开,left(2,4,2)+left(3,4,2)=0。

cost(l,r,m)可以理解为[l,r]区间在m点切成[l,m]和[m+1,r]两个区间,会有几个区间被切到(如果有个区间是包含或者等于区间[l,r]的话,是不会被切的)。cost(l,r,m)=cnt1(l,r,m)+cnt2(l,r,m)分别对应右端点小于r、左端点大于l且右端点大于等于r两种情况。

根据cost,计算dp数组如下:

dp(1,4)=min(dp(1,4),dp(1,1)+dp(2,4)+cost(1,4,1))=2

dp(2,4)=min(dp(2,4),dp(2,2)+dp(3,4)+cost(2,4,2))=1

dp(3,4)=min(dp(3,4),dp(3,3)+dp(4,4)+cost(3,4,3))=0

dp(2,4)=min(dp(2,4),dp(2,3)+dp(4,4)+cost(2,4,3))=0

dp(2,3)=min(dp(2,3),dp(2,2)+dp(3,3)+cost(2,3,2))=0

dp(1,4)=min(do(1,4),dp(1,2)+dp(3,4)+cost(1,4,2))=1

dp(1,2)=min(dp(1,2),dp(1,1)+dp(2,2)+cost(1,2,1))=0

dp(1,4)=min(dp(1,4),dp(1,3)+dp(4,4)+cost(1,4,3))=0

dp(1,3)=min(dp(1,3),dp(1,1)+dp(2,3)+cost(1,3,1))=1

dp(1,3)=min(dp(1,3),dp(1,2)+dp(3,3)+cost(1,3,2))=0

通过回溯以上dp数组的计算结果。可以画出最优线段树如图4所示。这两个已知查询时间区间被拆分的总次数为0。回溯过程包括dp(1,4)最小的是0,也就是分成dp(1,3)和dp(4,4)。然后dp(1,3)最小的也是0,分成了dp(1,2),dp(3,3),同理往下推,就是图4。

步骤3、挖掘阶段。获取待查询对象的待查询事件和待查询时间段,在该分布式数据库查找与该待查询事件相对应的索引树,作为待查询索引树,在该待查询索引树中查询该待查询时间段中每个对象的该权重和,作为该待查询对象的趋同程度,选择该趋同程度最高的对象作为挖掘结果

图5给出了根据储存在hbase中的索引树,获取对象q所涉及的所有事件的时间段集合。首先在hbase中查询对象q的四元组数据,按事件划分,并行的在每个事件上加载索引树并对时间段进行分割,每个分割后的时间段就对应索引树中的一个节点。q具有的事件,在数据库中不存在的话,这个事件的趋同程度算出来就是0;q的事件可以是数据库中没有的事件。

有了相应的时间段集合后,可以直接查询存储在hbase中的数据,并在spark上按对象对权重进行规约,得到每个对象相对于对象q的趋同程度。最后使用spark的分布式排序功能,对最终结果进行排序。该部分流程见图6。根据时间段便能直接查询,是因为每个分割后的时间段就对应索引树中的一个节点,每个节点的数据事先已经存在分布式数据库中了,只需要查询数据库,就可以直接获得该时间段的数据。按对象对权重进行规约,意思是把每个对象各自的权重加起来,最后得到的是每个对象的权重和,也就是每个用户相对于用户q的趋同程度。

以下为与上述方法实施例对应的系统实施例,本实施系统可与上述实施方式互相配合实施。上述施方式中提到的相关技术细节在本实施系统中依然有效,为了减少重复,这里不再赘述。相应地,本实施系统中提到的相关技术细节也可应用在上述实施方式中。

本发明还提出了一种分布式的趋同行为挖掘系统,其中包括:

事件划分模块,用于获取由四元组数据组成的数据集合,该四元组数据包括对象、事件、时间点和权重,将该数据集合按照事件类型划分为多个事件集合;

索引树构建模块,用于为该事件集合构建索引树,根据该事件集合中的时间点确定该索引树的时间总长,根据线段树划分法将该时间总长拆分为时间段,该索引树的每个节点对应该时间段中每个对象的权重和,存储该索引树至分布式数据库;

挖掘模块,用于获取待查询对象的待查询事件和待查询时间段,在该分布式数据库查找与该待查询事件相对应的索引树,作为待查询索引树,在该待查询索引树中查询该待查询时间段中每个对象的该权重和,作为该待查询对象的趋同程度,选择该趋同程度最高的对象作为挖掘结果。

该分布式的趋同行为挖掘系统,其中该索引树构建模块中的索引树构建过程、该挖掘模块中待查询索引树的查找过程以及趋同程度的计算过程均是在分布式平台的内存计算框架下完成的。

该分布式的趋同行为挖掘系统,其中该内存计算框架为spark框架。

该分布式的趋同行为挖掘系统,其中该线段树划分法包括:最优线段树法和平衡线段树法。

该分布式的趋同行为挖掘系统,其中该平衡线段树法采用二分存储时间段的方式构建该索引树;

该最优线段树法包括:

获取预设时间区间,按区间的右端点排序,合并相同的区间并计数;

统计当在时间点l断开时,有多少个以r为右端点的预设时间区间被断开,记为right(l,r);

根据right(l,r),统计当在时间点m断开,有多少个右端点小于r的区间被断开,记为cnt1(l,r,m);

按预设时间区间的左端点排序,合并相同的区间并计数;

统计当在时间点m断开时,有多少个以左端点为l且右端点大于等于r的区间断开,记为left(l,r,m);

根据left(l,r,m),统计当在时间点m断开,有多少个左端点大于l且右端点大于等于r的区间被断开,记为cnt2(l,r,m);

初始化cost数组为0,cost(l,r,m)=cnt1(l,r,m)+cnt2(l,r,m);

初始化dp数组为+∞,dp(i,i)=0;

dp(l,r)=min(dp(l,r),dp(l,m)+dp(m+1,r)+cost(l,r,m))

其中l≤m<r,相同dp值时选靠近中点的m值,dp(l,r)表示区间[l,r]拆分该预设时间区间的最少次数;

通过回溯该dp数组,以构建该索引树。

虽然本发明以上述实施例公开,但具体实施例仅用以解释本发明,并不用于限定本发明,任何本技术领域技术人员,在不脱离本发明的构思和范围内,可作一些的变更和完善,故本发明的权利保护范围以权利要求书为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1