system: [SYSTEM]

user: 4. 基于矩阵改进的Apriori算法 本文利用矩阵运算的原理来对算法进行改进，一是通过减少对数据库的扫描，二是快速计算候选项集的支持度。 4.1. 关概念与性质 定义1：项集布尔矩阵，对要进行数据挖掘的事务数据库，首先扫描数据库得到数据源，将数据库中事务数据表转换为项集布尔矩阵D。矩阵的行向量与列向量分别对应的是事务集和项目集，若第i个事务中出现有第j个项目，则矩阵的第i行、第j列的值为1，否则为0。构建的项集布尔矩阵如下： D = [ d 11 d 12 ⋯ d 1 n d 21 d 22 ⋯ d 2 n ⋮ ⋮ ⋯ ⋮ d m 1 d ( m 2 ) ⋯ d m n ] 其中， d i j = { 1 ， d i j ∈ T i 0 ， d i j ∉ T i ， ，式中 i = 1 ， 2 ， ⋯ ， m ， j = 1 ， 2 ， ⋯ ， n 。 在项集布尔矩阵当中，项集的支持度为矩阵当中每一列1的个数。 I = ( I 1 ， I 2 ， ⋯ I n ) 是数据库中项目的集合，则第 I i 项目的支持度为： support _ count ( I j ) = ∑ i − 1 m d i j 第一个项集 I 1 的支持度为： support _ count ( I 1 ) = d 11 + d 21 + ⋯ + d m 1 定义2：项集布尔矩阵的向量 D i j 表示2-项集 I i j ： D i j = D i ∧ D j = [ d 1 i ∧ d 1 j d 2 i ∧ d 2 j ⋮ d m i ∧ d n j ] 上述的项集矩阵公式中，操作符号“ ∧ ”是矩阵列向量进行“与”运算。则 I i j 的支持度的计算公式为： support _ count ( I i I j ) = ∑ k − 1 n d k i ∧ d k j 如： support _ count ( I 1 I 2 ) = d 11 ∧ d 12 + d 21 ∧ d 22 + ⋯ + d m 1 ∧ d m 2 定义3：k-项集 { I 1 ， I 2 ， ⋯ I k } 的向量定义为 D 12 ⋯ k = D 12 ⋯ ( k − 2 ) ∧ D 12 ⋯ ( k − 1 ) 则k-项集的支持度计数为： support _ count ( I 1 I 2 ⋯ I j ) = ∑ k − 1 n ( ( d p 1 ∧ d p 2 ∧ ⋯ ∧ d ( p k − 1 ) ) ∧ d p k ) 性质1：如果事务的长度为k则产生的频繁项集项的个数小于或等于k。 性质2：频繁k-项集若可以继续产生频繁 ( k + 1 ) 项集，频繁 k − 项集中的个数大于k。 4.2. 改进算法的主要步骤 1) 对事务数据库进行全部扫描。同时设定项集的支持度和置信度，若满足上述的条件，矩阵的行向量对应事务集，列为项集。为了方便矩阵计算，在项集布尔矩阵计算时增加 s u m _ r 行用来计算每一列的和即求矩阵每一列对应项集的支持度。 2) 项集的布尔矩阵计算每列1的个数。增加矩阵的一行 s u m _ r 用来统计每列1的数值，若该数值小于支持度，则把该值对应的列向量删除。其余的都是频繁1-项集对应的列向量，得频繁1-项集矩阵 D ( 1 ) ，求得 L 1 频繁项集。 3) 求 k ( k ≥ 2 ) 维频繁项集的，对频繁 D ( k − 1 ) 矩阵的对列向量“与”运算，在对运算之后的列向量求和，不符合条件的删除，剩下的列向量对应的是频繁项集，得频繁 k − 项集矩阵 D ( k ) 。 4) 复执行上述的2和3步骤，经操作后把不满足的列向量不断删除，矩阵不断地被压缩。根据性质2，若频繁项集计算到 ( k − 1 ) 项集的个数，即矩阵的列的个数小于k时，停止算法运算。 4.3. 应用实例 具体通过以下的事务数据库，如下表1所示，其中有7个事务， D = { T 1 ， T 2 ， T 3 ， T 4 ， T 5 ， T 6 } ， I = { I 1 ， I 2 ， I 3 ， I 4 ， I 5 ， I 6 } ，规定项集的最小支持度计数为2。 Table 1 Transaction dat 事务 项目 T 1 I 1 ， I 3 ， I 4 ， I 6 T 2 I 2 ， I 3 ， I 4 ， I 6 T 3 I 4 ， I 5 ， I 6 T 4 I 1 ， I 2 ， I 5 T 5 I 1 ， I 2 ， I 3 T 6 I 3 ， I 5 ， I 7 表1. 事务数据表 I：对事务表映射成布尔矩阵，事务包含该项目的值为1，否则为0。转换后的数据库如下表： 根据定义1由表2对事务数据表生成项集布尔矩阵，对矩阵的列向量进行求和 Table 2 Transaction dat TID I 1 I 2 I 3 I 4 I 5 I 6 I 7 T 1 1 0 1 1 0 1 0 T 2 0 1 1 1 0 1 0 T 3 0 0 0 1 1 1 0 T 4 1 1 0 0 1 0 0 T 5 1 1 1 0 0 0 0 T 6 0 0 1 0 1 0 1 表2. 事务数据表 I 1     I 2     I 3     I 4   I 5     I 6   I 7 D = ( D 1 ， D 2 ， ⋯ ， D 7 ) = [ 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 ]                       [ 3     3     4     3     3     3       1 ] 生成L 1 频繁项集，由定义2，计算每个项集的支持度，则I 1 的支持度为： support _ count ( I 1 ) = ∑ i − 1 6 d i 1 = 3 则每个1-项集的支持度如下表3： Table 3 Itemsets Ii suppor I j count ( I j ) I 1 3 I 2 3 I 3 3 I 4 4 I 5 3 I 6 3 I 7 1 表3. 项集I i 的支持度 由关联规则的条件可知，I 7 为非频繁项集，则得到频繁1-项集 L 1 = { I 1 ， I 2 ， I 3 ， I 4 ， I 5 ， I 6 } ，项集I 7 对应的列D 7 进行删除，因为I 7 的支持度小于 min _ sup ，删除不满足的候选集列向量。经过删除后的矩阵为频繁1-矩阵D(1)： I 1     I 2     I 3     I 4   I 5     I 6 D ( 1 ) = [ 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 ] II：生成频繁2-项集。由定义2，在求频繁2-项集时，利用经过逻辑“与”运算得2-项D(1)集矩阵，再对每一列进行计数，若列向量求和小于支持度的删除不满足的列向量得到频繁2-项集矩阵，则I 12 的支持度计数为： D 12 = D 1 ∧ D 2 = [ d 11 ∧ d 12 d 21 ∧ d 22 ⋮ d 61 ∧ d 62 ] = ( 0 0 0 1 1 0 ) T 则I 12 的支持度计数为： support _ count ( I 12 ) = 2 删除不满足的列向量后的频繁2-项集矩阵如下： I 12   I 13   I 23   I 34     I 36     I 46 D ( 2 ) = [ 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 ] 则频繁2-项集的支持度数如下表4： Table 4 Itemsets Iij suppor I ij count ( I j ) I 12 2 I 13 2 I 23 2 I 34 2 I 36 2 I 46 3 表4. 项集I ij 的支持度 则频繁2-项集为 L 2 = { I 12 ， I 13 ， I 23 ， I 34 ， I 36 ， I 46 } 。 III：生成频繁3-项集。同理进行对上述相同的运算，根据性质1，频繁k-项集的事务个数的长度小于或等于k，若在生成频繁k项集，项集连接产生的事务个数大于k，则删除该项集的连接。若产生的项集为重复的项集，保留一个项集的列向量，其余删除，得频繁3-项集矩阵。 I 346 D ( 3 ) = [ 1 1 0 0 0 0 ] count ( I 346 ) = 2 L 3 的项集的列向量只有1列，即个数只有1个，根据步骤(4)，小于4，则不用继续求L 4 。L 3 频繁项集I 346 为最大的频繁项集。 上述的改进算法是运用矩阵的向量运算来优化频繁项集的产生，先对数据库扫描转化为数据表储存，将数据表映射为0~1的项集布尔矩阵。项集的支持度通过矩阵的列进行“与”运算求得，矩阵的列向量求和数值的计算就可以求出频繁项集，减少了算法在运行过程中项集的连接和剪枝。改进的算法只对数据库的访问一次，储存项集布尔矩阵，利用转化后的矩阵运算，优化各项集的大小，提高算法的执行效率。本文利用的只是对矩阵的列向量来进行项集的支持度计算，对于矩阵的行向量不参与计算，这样每个k-项集的支持度都能够计算。而很多研究者通过进行矩阵的行和列同时计算，这种方法只能找到最大的频繁项集，但不能准确求出每一个频繁项集的支持度。 4.4. 算法实验与分析 为验证算法的效率，比较传统的Apriori算法与改进算法的在不同的交易事务数下的执行效率。 实验1：比较基于矩阵压缩的算法和Apriori算法在不同的数据量的运行时间。 由图1的实验结果表明，随着项集的数据量不断增大时，两个算法运行的时间都是不断增长。可以明显得出各算法在处理相同数据时，耗时是有所差别。当数据量较少时，基于矩阵改进的算法的效果与传统的算法不是特别明显。但是计算大数据量时，特别是在处理数据量超过400个时，两者明显出现差别。传统的算法耗时急剧增长，改进算法虽然也随着数据量增大所用时间也增大，但是改进算法所耗时长非常的平缓。说明改进的算法效率比Apriori算法要更适合处理数据大的问题。 图1. 不同数据量下算法运行时间 实验2：如图2所示比较基于矩阵压缩的算法和Apriori算法在不同的支持度下运行时间。 图2. 不同支持度下算法运行时间 从图2的图像上表明，一开始，图像急剧下降非常明显。这实验现象说明了当支持度越小时，需要计算的项集就越多。支持度越大时，删除不满足条件的项集就越多，加快算法的运行效率，减少数据的冗余计算。由于支持度越小，满足条件的项集就越多，产生的候选集是成几何增长的，运行时间较长，所以图的两条曲线都是下降的。在同样的支持度下，改进后的算法运行的时间比原来的算法大大的缩短。 从图1和图2的结论表明，不论是处理数据量的大小，还是不同的支持度下，基于矩阵改进的算法在处理大量的数据时表现更为优越和高效率。