具体实施方式
为了更好地理解本发明的技术方案,下面结合附图对本申请的实施例进行详细描述。
应当明确,所描述的实施例仅仅是本申请的一部分实施例,而不是全部的实施例的罗列。基于本公开中描述的实施例,本领域普通技术人员在没有付出创造习惯劳动的情况下所获得的所有其他变化例都属于本申请的保护范围。
一般而言,关联规则挖掘主要由两个步骤构成,即从事务数据集中挖掘所有支持度不小于最小支持度阈值的频繁项集,然后从中生成满足最小置信度阈值要求的关联规则。例如,总项集R={I1,I2,...,Im}是物品集,W={T1,T2,...,Tn}是事务集或称交易集,其中的每件事务T亦可称为交易。事务T可被认为是总项集R上的一个子集,即一组物品,则有
在关联规则设计中,有几个常用关键指标。一个常用关键指标称为支持度。支持度是指某个项集在整个数据集中出现的比例,它通常用来寻找频繁项集,即寻找频繁共现项。项集的支持度一般被定义为总项集中包含该项集的事务的占比。例如,对于任一项集X,令/>为事务集W中包含项集X的事务的数量,则项集X的支持度support(X)即为项集X在事务集W中出现的概率:
根据另一替换实施例,也可仅计算项集X在事务集W中出现的次数作为支持度统计。
图1示出了根据一示例性情形的购物篮交易场景100。如所可见,交易标识列中的序号标识了不同的交易,而物项列则表示了相应交易所包括的物项。例如,交易标识为0的一笔交易包括了以下物项:牛奶和青菜。又如,交易标识为1的一笔交易包括了以下物项:青菜、尿布、洗衣液。在图1的场景100的情况下,例如,项集{牛奶}的支持度为4/5=0.8,项集{青菜}的支持度为4/5=0.8,项集{橙汁}的支持度为2/5=0.4,项集{牛奶,青菜}的支持度为3/5=0.6,项集{青菜,橙汁}的支持度为1/5=0.2等等。
在关联规则设计中,另一个常用关键指标为置信度。置信度一般是针对某个关联规则定义的。关联规则是指在有项集A的情况下,可以在某个置信度下推出项集B。即,如果A发生,则很有可能B也会发生。
例如,以图1的示例情形100为例。假定一关联规则为{青菜}→{牛奶},则置信度的计算公式为{青菜,牛奶}的支持度除以{青菜}的支持度,即0.6/0.8=0.75。这表明在所有买了青菜的客户中,有75%的客户也买了牛奶。假定另一关联规则为{青菜}→{橙汁},则置信度为{青菜,橙汁}的支持度除以{青菜}的支持度,即0.2/0.8=0.25。这表明在所有买了青菜的客户中,有25%的客户也买了橙汁。通过比较可以发现,{青菜}→{牛奶}的关联度远高于{青菜}→{橙汁}的关联度。这种关联关系反映了顾客的购买行为模式。
如所可知,图1中的示例性情形100为方便理解起见仅示出5笔交易和共包括6种物品的总项集,但在实际场景中,交易笔数和所涉及的物品项集将远不止于此。
机器学习领域经典的频繁项集和关联规则挖掘算法包括Apriori模型和FP-Growth(亦称频繁模式FP树)模型等。FP-Growth模型通过构建FP树,巧妙地将数据存储在树中,整个过程只需要扫描数据两次,大大提高了频繁集挖掘的效率。
图2示出了根据本公开一示例性实施例的根据FP-Growth模型进行频繁项集挖掘的场景200的示例。
在场景200中,假定有如下表1所示的的事务集。
交易标识 |
物项 |
0 |
a,b,c |
1 |
c,d,b,a |
2 |
d,e,a |
3 |
b,a |
表1
如所可见,与交易标识0相对应的交易包括物项a、b和c,与交易标识1相对应的交易包括物项c、d、b和a,与交易标识2相对应的交易包括物项d、e和a,以及与交易标识3相对应的交易包括物项b和a。
FP-Growth模型在获得该组事务数据之后,对所有物项元素进行支持度统计。例如,可以仅统计物项元素(即,单个物项)在事务集中的出现次数,得到a:4,b:3,c:2,d:2,e:1。根据另一替换实施例,也可统计物项元素在事务集中出现的概率,得到a:1,b:0.75,c:0.5,d:0.5,e:0.25。
在获得物项元素的支持度统计之后,可以按照支持度排序来对事务集中每个事务的物项进行排序。
另一方面,FP-Growth模型可对物项元素进行筛选。根据一示例性而非限定性实施例,可基于最小支持度阈值来对物项元素进行筛选。例如,在支持度统计包括物项元素在事务集中的出现次数的情况下,可设置最小支持度为例如2。又如,在支持度统计包括物项元素在事务集中出现的概率的情况下,可设置最小支持度为例如0.5。如所可知,以上最小支持度阈值的具体数值仅为示例,本公开并不被限定于此。
在此基础上,FP-Growth模型可剔除支持度低于该最小支持度阈值的那些物项元素。例如,在本例中,可以剔除物项e,因其支持度低于最小支持度阈值。从而,FP-Growth模型可以建立项头表如下表2所示:
表2
如所可见,项头表包括未被剔除的所有物项元素,且按支持度排序。
另一方面,基于物项元素的剔除,可更新事务集如下表3所示:
交易标识 |
物项 |
0 |
a,b,c |
1 |
a,b,c,d |
2 |
a,d |
3 |
a,b |
表3
如所可见,已剔除的物项元素被从各事务的相应物项中移除,并且各事务的其余物项按其在项头表中的顺序(即,按其支持度)进行排序。
基于所建立的项头表,FP-Growth模型可以创建相应的FP树。FP树的根节点可为空(Null)。创建FP树时,当待添加的事务与FP树中的路径相同,则只需更新物项元素对应的计数(即,发生次数);如果待添加的记录与FP树存在不一致,则在不一致的地方分叉,创建新的节点。
以上述事务集为例,FP-Growth模型可以先向FP树中添加第一件事务,即与交易标识0相对应的交易{a,b,c}。图3示出了根据本公开一示例性实施例的此时的FP树。如所可见,在添加第一件事务(即,交易{a,b,c})后,FP的根节点连接到节点a,节点a连接到节点b,节点b进一步连接到节点c。此时,a、b和c节点的计数均为1。与此同时,可使项头表中的a、b和c的头指针分别指向FP树中的a、b和c节点。
接着,FP-Growth模型可以先向FP树中添加第二件事务,即与交易标识1相对应的交易{a,b,c,d}。图4示出了此时的FP树。如所可见,在添加第二件事务(即,交易{a,b,c,d})时,由于原FP树中已存在Null→a→b→c的路径,因此此时无需创建新的a、b和c节点,而仅需将其各自的计数加一。然而,对于该笔交易中的事务元素d,由于其并不存在于原FP树中,因此需要在c节点后添加一个新的节点d,并将其计数记为1。此时,项头表中的a、b和c的头指针仍分别指向FP树中的a、b和c节点,而d头指针则指向新添加的节点d。
然后,FP-Growth模型可以先向FP树中添加第三件事务,即与交易标识2相对应的交易{a,d}。图5示出了此时的FP树。如所可见,在添加第三件事务(即,交易{a,d})时,由于原FP树中已存在Null→a的路径,因此此时无需创建新的a节点,而仅需将其计数加一。然而,对于该笔交易中的事务元素d,由于其与原FP树中的路径不一致,因此需要在a节点后添加一个新的节点d,并将其计数记为1。此时,项头表中的a、b和c的头指针仍分别指向FP树中的a、b和c节点,而d的头指针则通过路径Null→a→b→c→d中的d节点到路径Null→a→d中的d节点的指针,来指向本次新添加的节点d。
最后,FP-Growth模型可以先向FP树中添加第四件事务,即与交易标识3相对应的交易{a,b}。图6示出了此时的FP树。如所可见,在添加第四件事务(即,交易{a,b})时,由于原FP树中已存在Null→a→b的路径,因此此时无需创建新的a和b节点,而仅需将其各自的计数加一。此时,项头表中的a、b、c和d的头指针的指向不变。
如所可见,建立项头表和创建FP树仅需要扫描数据两次。第一次扫描可以得到所有频繁一项集的计数,然后移除支持度低于阈值的物项元素,再将频繁一项集按支持度降序排列放入项头表。第二次扫描可以将每条事务数据剔除非频繁一项集(即,支持度低于阈值的物项元素)并按支持度降序对该事务数据中的物项元素进行排序,此后将事务集中的每件经排序的事务插入到FP树中即可。
FP-Growth模型在创建了FP树之后,即可以进行频繁项集挖掘。一般而言,需要对每一个频繁项逐个进行挖掘。其具体过程可包括首先获得频繁项的前缀路径即条件模式基,然后将该前缀路径作为新的数据集,依次构建前缀路径的条件FP树,然后迭代前述步骤,直至树仅包含一个元素项为止。
根据一示例性而非限定性实施例,可从项头表自下向上或自上向下依次进行挖掘。例如,根据项头表,可以从最底部的d节点开始挖掘。图7示出了d节点的FP子树和条件模式基。如所可见,首先获得d节点的FP子树,它有两个叶节点。接着将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:1,c:1}。如所可见,由于a节点是两个叶节点d共同的祖先节点,因此其计数为2;而b节点和c节点仅为其中一个叶节点d的祖先节点,因此其计数为1。
基于此,可得到d的频繁2项集为{a:2,d:1}、{b:1,d:1}、{c:1,d:1};频繁3项集为{a:2,b:1,d:1}、{a:2,c:1,d:1}、{b:1,c:1,d:1};频繁4项集为{a:2,b:1,c:1,d:1}。
接着,可对c节点进行挖掘。图8示出了c节点的FP子树和条件模式基。如所可见,首先获得c节点的FP子树,它只有一个叶节点。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:2}。
基于此,可得到c的频繁2项集为{a:2,c:2}、{b:2,c:2};频繁3项集为{a:2,b:2,c:2}。
随后,可对b节点进行挖掘。图9示出了b节点的FP子树和条件模式基。如所可见,首先获得b节点的FP子树,它只有一个叶节点。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:3}。
基于此,可得到b的频繁2项集为{a:3,b:3}。
根据本公开的一示例性而非限定性实施例,为了减少挖掘时间,提高运行效率,可对频繁集的最大长度进行限制。根据一示例,频繁集的最大长度可被限为2。
根据一示例性而非限定性实施例,可从项头表自下向上或自上向下依次进行挖掘。例如,根据项头表,可以从最底部的d节点开始挖掘。图10示出了d节点的FP子树和条件模式基。如所可见,首先获得d节点的FP子树,它有两个叶节点。接着将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:1,c:1}。如所可见,由于a节点是两个叶节点d共同的祖先节点,因此其计数为2;而b节点和c节点仅为其中一个叶节点d的祖先节点,因此其计数为1。
由于频繁集的最大长度被限为2,因此可得到d的频繁2项集为{a:2,d:1}、{b:1,d:1}、{c:1,d:1}。
接着,可对c节点进行挖掘。图11示出了c节点的FP子树和条件模式基。如所可见,首先获得c节点的FP子树,它只有一个叶节点。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:2}。
由于频繁集的最大长度被限为2,因此可得到c的频繁2项集为{a:2,c:2}、{b:2,c:2}。
随后,可对b节点进行挖掘。图12示出了b节点的FP子树和条件模式基。如所可见,首先获得b节点的FP子树,它只有一个叶节点。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:3}。
由于频繁集的最大长度被限为2,因此可得到b的频繁2项集为{a:3,b:3}。
根据本公开的另一示例性而非限定性实施例,为了减少挖掘时间,提高运行效率,除了对频繁集的最大长度进行限制,还可移除条件模式基中支持度低于阈值的节点。例如,根据一示例,频繁集的最大长度可被限为2,而最小支持度阈值可为例如2。
根据一示例性而非限定性实施例,可从项头表自下向上或自上向下依次进行挖掘。例如,根据项头表,可以从最底部的d节点开始挖掘。图10示出了d节点的FP子树和条件模式基。如所可见,首先获得d节点的FP子树,它有两个叶节点。接着将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:1,c:1}。如所可见,由于a节点是两个叶节点d共同的祖先节点,因此其计数为2;而b节点和c节点仅为其中一个叶节点d的祖先节点,因此其计数为1。由于最小支持度阈值为2,因此支持度低于此阈值的b节点和c节点被删除。
由于频繁集的最大长度被限为2,因此可得到d的频繁2项集为{a:2,d:1}。
接着,可对c节点进行挖掘。图11示出了c节点的FP子树和条件模式基。如所可见,首先获得c节点的FP子树,它只有一个叶节点。此条件模式基中的节点均满足最小支持度阈值。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:2,b:2}。
由于频繁集的最大长度被限为2,因此可得到c的频繁2项集为{a:2,c:2}、{b:2,c:2}。
随后,可对b节点进行挖掘。图12示出了b节点的FP子树和条件模式基。如所可见,首先获得b节点的FP子树,它只有一个叶节点。此条件模式基中的节点均满足最小支持度阈值。接着,将该FP子树中的所有祖先节点的计数设置为叶节点的计数即{a:3}。
由于频繁集的最大长度被限为2,因此可得到b的频繁2项集为{a:3,b:3}。
以下表4示出了结果所得的频繁集。如所可见,此频繁集项表中还包括单元素的1项集。另外,节点的计数被省略。
元素 |
频繁集项 |
a |
{a} |
b |
{b}{b,a} |
c |
{c}{c,a}{c,b} |
d |
{d}{d,a} |
表4
如前所述,在很多实际场景中不需要获取所有的频繁集项,而原始FP-Growth算法会输出所有的频繁集项,因此在数据量较大的情况下会造成计算资源和时间的浪费。本算法在频繁集项挖掘阶段,通过限制挖掘深度可以大大减少无意义计算。经试验验证,本方法可以大大提升频繁集项的挖掘效率,实际测试结果显示,本公开的方法可以在20分钟内挖掘出171991623条长度≤6的频繁集项。而如果使用原生算法先挖掘出所有的频繁集项,再筛选出频长度≤6的频繁集项,测试结果显示:算法在48小时内仍未完成计算工作。
图13示出了根据本公开的一方面的可限定最大长度的频繁集挖掘方法1300的流程图。
方法1300可包括在框1310建立项头表。项头表可以基于事务数据来建立。根据一示例性而非限定性实施例,事务数据可如例如图1所示的购物篮交易场景100所示。基于事务数据来建立项头表可包括例如对所有元素进行支持度统计。支持度统计可包括统计单个元素在事务集中的出现次数或出现概率。基于事务数据来建立项头表还可进一步包括对各个元素进行支持度排序(例如,降序排列)。
根据另一示例性而非限定性实施例,项头表的建立还可基于最小支持度阈值。最小支持度阈值可根据各种因素来设置,诸如系统资源、配置、效率要求等等。基于最小支持度阈值来建立项头表可包括在建立好的项头表中剔除支持度低于最小支持度阈值的那些元素。剔除支持度低于最小支持度阈值的元素可以在基于支持度排序建立项头表之前、同时或之后进行。
方法1300可进一步包括在框1320建立FP树。FP树的建立可如以上结合例如图3–图6所描述。建立FP树可包括例如建立空节点作为该FP树的根节点,然后将经更新的事务集中的每条事务插入到FP树中。经更新的事务集中的每条事务可以是剔除了支持度低于最小支持度阈值的那些元素并且按支持度对其余元素进行了排序后所得的元素子集。插入事务时,每条事务中的物项元素中排序靠前的节点是祖先节点,而靠后的则是子孙节点。如果已有共同的祖先,则对应的共同祖先节点的计数加1。插入后,如果有新节点出现,则项头表对应的节点会通过头指针指向新节点。
建立好FP树之后,方法1300可进一步包括在框1330进行频繁集挖掘。频繁集挖掘可如以上结合图7–9和/或图10–12所描述。
例如,频繁集挖掘可包括首先获得FP树中的每个频繁项(即,节点)的前缀路径即条件模式基,即以所要挖掘的节点为叶节点的FP子树。当得到相应的FP子树时,将该子树中的每个节点的计数设置为叶节点的计数,并可删除计数低于支持度阈值的节点。然后将该条件模式基作为新的数据集,依次构建前缀路径的条件FP树,然后迭代前述步骤,直至树仅包含一个元素项为止。由此,从该条件模式基,便可递归地挖掘得到频繁项集。当得到一FP子树的所有频繁二项集后,可通过递归合并二项集等方式得到频繁三项集、频繁四项集等等……。
根据本公开的一示例,频繁集挖掘还可基于频繁集最大长度限制。例如,可将频繁集的最大长度限为2,从而仅挖掘频繁二项集。又如,可将频繁集的最大长度限为3,从而仅挖掘频繁二项集和频繁三项集,等等,依此类推。通过限制挖掘深度可以大大减少无意义计算。频繁集最大长度限制可以基于具体需要和/或经验。经试验验证,本方法可以在保证满足性能要求的前提下大大提升频繁集项的挖掘效率。
完成频繁集挖掘后,方法1300可进一步包括在框1340输出最终所得的频繁集。频繁集挖掘可被应用于购物、风控、客户流失分析、故障预警、征信、推荐、预测等以及任何其他事务之间具有关联的场景。
图14示出根据本公开的一方面的用于可限定最大长度的频繁集挖掘装置1400的框图。装置1400可包括用于建立项头表的模块1410;用于建立FP树的模块1420;用于进行频繁集挖掘的模块1430;以及用于输出最终所得的频繁集的模块1440。根据示例性而非限定性实施例,模块1410–1440可以执行以上结合图13的框1310–1340描述的动作和功能。
根据一示例性而非限定性实施例,事务数据、最小支持度和/或频繁集等可以从装置1400的外部输入。根据其他实施例,最小支持度阈值和/或频繁集最大长度限制也可以是预先配置在装置1400中的,或者是由装置1400计算或确定的。事务数据也可以由装置1400通过其他方式来获得。
在原生的FP-Growth中,算法会将所有支持度大于设定值的频繁集项全部挖掘出来。但是在很多应用场景中,只需要挖掘出长度≤阈值的频繁集项。因此,如果在所有频繁集项挖掘完毕之后,再对长度进行筛选,则会大大浪费计算资源和时间。本发明主要解决的问题是通过对FP-Growth算法中递归挖掘频繁集项的过程进行深度限制,从而限定最终频繁集的长度,大大减少挖掘时间,提高运行效率。
装置1400的各个模块可以用各种方式来实现。例如,上述模块可以被配置成软件。根据一示例性而非限定性实施例,上述模块可以按处理器可读指令的形式被存储在存储器中,并在由处理器执行时实现相应的功能。根据另一示例性而非限定性实施例,上述模块可被实现在存储处理器可读指令的计算机可读介质上。
在其他方面,装置1400的各个模块也可被实现为硬件。例如,装置1400的各个模块可被实现为逻辑块、电路模块、通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或其他可编程逻辑器件、门或晶体管逻辑、硬件组件等或其任何组合。
在进一步的方面,装置1400的各个模块也可被实现为硬件与软件的组合(诸如,固件)。本公开在此方面并不受限定。
本领域普通技术人员应理解,本发明的有益效果并非由任何单个实施例来全部实现。各种组合、修改和替换均为本领域普通技术人员在本发明的基础上所易于明了。
此外,除非特别指出,否则术语“或”旨在表示包含性“或”而非排他性“或”。即,除非另外指明或从上下文能清楚地看出,否则短语“X采用A或B”或类似短语旨在表示任何自然的可兼排列。即,短语“X采用A或B”藉由以下实例中的任何实例得到满足:X采用A;X采用B;X采用A和B两者。术语“连接”与“耦合”可表示相同含义,即两组件之间直接的或经由一个或多个居间组件的间接耦合。另外,本申请和所附权利要求书中所用的冠词“一”和“某”一般应当被理解为表示“一个或多个”,除非另外特别声明或从上下文中可以清楚地看出是指单数形式。
各个方面或特征以可包括数个设备、组件、模块及类似物等的系统的形式来呈现。应理解的是,各种系统可以包括附加的设备、组件、模块及类似物等,和/或可以并不包括所讨论的实施例中的设备、组件、模块及类似物的全体。
结合本文中所公开的实施例描述的各种说明性逻辑、逻辑块、模块和电路可以用通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或其他可编程逻辑器件、门或晶体管逻辑、硬件组件。但在替换方案中,处理器可以是任何常规的处理器、控制器、微控制器或状态机。以上结合方法描述的实施例可以通过处理器和与之耦合的存储器来实现,其中处理器可被配置成执行前述任何方法的任何步骤或其组合。
结合本文中的实施例描述的方法或算法的步骤和/或动作可直接在硬件中、在由处理器执行的软件模块中、或在这两者的组合中实施。例如,以上结合各个方法描述的实施例可以通过存储有计算机程序代码的计算机可读介质来实现,其中该计算机程序代码在由处理器/计算机执行时执行前述任何方法的任何步骤或其任何组合。
本公开中通篇描述的各种方面的要素为本领域普通技术人员当前或今后所知的所有结构上和功能上等效的方案均被本公开所覆盖。此外,本文中任何内容无论是否在权利要求书中被述及,均并非旨在贡献给公众。