陈老师Apriori算法整理(缺点:1.通用性不强,只解决3项集的问题未做推广2.算法程序为加上优化,封装、连接等操作3.置信度的计算不全,缺1->2 2->1等情况)
说明:支持度范围大于0小于1,因为分母是一样的,所以用支持度计数代表支持度
传统Apriori算法候选项集多(主要是二项集),且需要频繁扫描数据库。效率较低。现提出一种优化算法。通过一次扫描数据库生成上三角矩阵,通过此上三角矩阵直接生成频繁1项集、频繁2项集及候选3项集,避免了Apriori算法产生过多的候选2项集的问题,同时减少了频繁2项集自连接后进行剪枝的步骤;在第二次扫描数据库时,他只将数据库中对计算支持度产生作用且项数不小于3的项集形成链表,进而提高算法的执行效率。
具体步骤如下:
步骤一:扫描数据库,构造2项集的支持度矩阵M。
步骤二:根据最小支持度技术,遍历矩阵得到L1、L2与C3.
步骤一具体操作方法如下:在矩阵中,以集合I的项作为矩阵相应的行标和列标,矩阵中的某一元素Mij表示二项集{Ii,Ij}在事务数据库中出现的次数。扫描过程为:如果扫描到一条事务中包含有{Ii,Ij}二项集,则在矩阵中对应Mij位置的元素计数值加1,在扫描过程中依次对单项进行计数,将技术结果贴入主对角线对应的位置。
步骤二具体操作方法如下:读取矩阵M的主对角线数据并与支持度进行比较即可得到L1,遍历矩阵M的上三角数据并与支持度进行比较即可得到L2.从上到下逐行读取读取矩阵M的数据,首先找出第i行(i=1,2…,m)中不小于最小支持度计数的元素Mij;其次定位到第j行,如果Mij的值不小于最小支持度计数,那么寻找第j行中不小于最小支持度计数的元素Mij;最后再顺着第k列定位回到第i行,如果Mij的值也不小于最小支持度计数,那么则可以生成候选三项集{Ii,Ij,Ik}。根据上述步骤可知,只需扫描一次数据库就可以形成矩阵M,通过对矩阵遍历即可得到L1,L2和C3,避免了Apriori算法中产生大量候选2项集且不能剪枝的问题,也省略了L2自连接后的剪枝步骤。
然后根据以下两条性质确定最终的频繁3项集:
性质1:如果事务数据库中某事务的长度小于k,则由Lk-1生成Lk时,扫描该事务是对计算Ck中项集的计数不产生作用;
性质2:如果某项Ix属于I,但Ix不出现在Ck中,则在计算Lk时扫描Ix也是对计算候选项集的支持度不起作用。
根据以上两条性质,结合遍历矩阵找到的C3,寻找L3。
3.2举例说明
举例说明:最小支持度为2(>=2)
事务数据库D中的数据如下表所示:
ID |
Product |
1 |
L1 |
2 |
L2 |
3 |
L3 |
4 |
L4 |
5 |
L5 |
Trade_ID |
Product_list(真正数据库中用商品的ID号也就是纯数字组成) |
T001 |
L1,L2,L5 |
T002 |
L2,L4 |
T003 |
L2,L3 |
T004 |
L1,L2,L4 |
T005 |
L1,L3 |
T006 |
L2,L3 |
T007 |
L1,L3 |
T008 |
L1,L2,L3,L5 |
T009 |
L1,L2,L3 |
扫描数据库形成2项集支持度上三角矩阵M:
上三角矩阵M
扫描矩阵M并与最小支持度进行比较得L1,L2,C3
频繁1项集L1
项集 |
支持度计数 |