关联规则挖掘

 一、初步理解  

关联规则是数据挖掘技术的一个活跃的研究方向之一,其反映出项目集之间有意义的关联关系。关联规则可以广泛地应用于各个领域,既可以检验行业内长期形成的知识模式,也能够发现隐藏的新规律。有效地发现、理解和运用关联规则是数据挖掘任务的一个重要手段。

在处理大量数据时,很重要的一点是要理解不同实体间相互关联的规律。通常,发现这些规律是个极为复杂的过程。关联规则是一种十分简单却功能强大的、描述数据集的规则,这是因为关联规则表达了哪些实体能同时发生。

关联规则的传统应用多见于零售业(适用于线下而非线上)。关联规则挖掘的一个典型例子是购物篮分析。该过程通过发现顾客放入其购物篮中不同商品之间的联系,分析顾客的购买习惯。通过了解哪些商品频繁地被顾客同时购买,这种关联的发现可以帮助零售商指定营销策略。例如,在同一次去超市,如果顾客购买牛奶,他也购买面包(包括什么类型的面包)的可能性有多大?通过帮助零售商有选择地经销和安排货架,这种信息可以引导销售。例如,将牛奶和面包尽可能放近一些,可以进一步的刺激一次去商店同时购买这些商品。全球最大的零售商沃尔玛(Walmart)通过对顾客购物清单的数据挖掘发现了“尿布→啤酒”的关联规则,后来沃尔玛就把尿布和啤酒摆放在一起,从而双双促进了尿布和啤酒的销量。

关联规则的另一应用领域是健康医疗,利用关联规则找出经常同时发生的健康问题,以便诊断出患一种疾病的患者还可能进行额外的检查,从而判断该患者是否存在其他与此疾病经常连带发生的身体问题。

        其他应用领域还包括入侵检查、web日志分析、数据库访问模式、文档抄袭检测等等。

二、关联规则的概念

是项的集合。设任务相关的数据D是数据库事务的集合,其中每个事务T是项的集合,使得。每个事务有一个标识符,称作TID。

2.1 相关定义

支持度定义:假设有个支持度阀指(support threshold) s。 如果A是一个项集,A的支持度是指包含I的事务数目。或者是包含I的事务数目与总事务数的百分比。如果支持度不小于s,则称A是频繁项集(frequent itemset)。

  A的支持度(support)= 包含A的事务数 或者 包含A的事务数/总的事务数

2.2 关联规则(association rule)定义

关联规则的形式为A->j,其中A是一个项集,而j是一个项。该关联规则的意义为,如果A中所有项出现在某个事务中的话,那么j“有可能”也出现在这一事务中。

这个“有可能”可以通过定义规则的可信度/置信度(confidence)来形式化的给出。

A->j的可信度(confidence) = A∪j 的支持度/A的支持度

但是如果包含A的购物篮中包含j的概率等于所有购物篮中包含j的概率, 比较极端的是实际上所有的购物篮(事务)都包含j,那么即使A包含j的概率为100% 也是没有意义的,为了区分出这种A对j的兴趣度衡量。

    A->j的兴趣度(interest) = A->j的可信度 - j的支持度

当这个值很高或者是绝对值很大的负值都是具有意义的。前者意味着购物篮中A的存在在某种程度上促进了j的存在,而后者意味着A的存在会抑制j的存在。

        同时满足最小支持度阈值(min_sup)和最小置信度阈值(min_conf)的规则称作强规则。

        项的集合称为项集(itemset)。包含k个项的项集称为k-项集。集合{computer,financial_management_software}是一个2-项集。

       识别有用的关联规则并不比发现频繁项集难很多,以为他都是以支持度为基础的。实际当中,对于传统的零售商店的销售而言,“相当地高”大概相当于所有购物篮的1%左右。

三、预选算法与数据结构的数学分析

我们假定购物篮组成的文件太大以至于无法在内存中存放。因此,任何算法的主要时间开销都集中在将购物篮或者事务从磁盘读入内存这个过程。。

3.2 项集计数中内存使用

   当对数据进行一遍扫描时,所有的频繁项集算法要求我们必须在内存中维护很多不同的计数值。例如,我们必须要记录每两个项咋购物篮中出现次数。如果没有足够内存来存放这些数字,那么随机对其中的一个数字加1都很有可能需要将一个页面从磁盘载入到内存,如果这样,算法就会发生内存抖动现象。从而运行速度可能会比从内存中直接找到这些数字慢好几个数量级。所以结论是,我们不能对不能放入内存的任何对象计数。因此,每个算法必须有个能处理的项数目的上限。
例如:假定项目总数目n, 并且算法会计算所有项对的数目。因此,我们需要空间存储(n 2)及C2 20 = n的平方/2个整数,如果每个整数需要4字节,总共需要2n pow 2个字节。如果我们的机器有2GB即2 pow 31字节内存,那么必须要求n<=2pow 15。
如果项是字符串,可以表示为1-n上的整数。如果项没有采用这种表示方法,我们就需要哈希表将他们从文件中的表示形式转化为整数。如果该项已经存在,那么就可以从哈希表中获得其对应的整数码,如果不存在,那么就将下一个可用的数字赋给它,并将项及其整数码放入到哈希表中。(当然简单一点,并且可以通过哈希函数映射到不同的连续的整数空间上,这个哈希表不需要实际的存在,因为哈希函数的规则能够正确帮助我们找到这个整数码,这个整数码也就转换为项对的存放地址)
哈希表1 如bread-0
        apple-1
        beer -2......

3.2.1 三角矩阵方法(triangular matrix)

    在将项都编码成整数之后,我们可以使用三角矩阵来存放计数结果,i<j,a[i,j]。对每一个对需要空间一个integer = 4 bytes
   但是这种策略会使得数组的一般元素都没有使用。一个更节省空间的方法是使用一个一维的三角数组(trangular array)
有1<=i<=j<=n,k=(i-1)(n-i/2)+(j-i)。即{i,j}对应为a[k]。这种布局相当于将所有的项对按照字典顺序排序,即一开始是{1,2},{1,3},。。。,{1,n},{2,3},{2,4},。。。{2,n}。。。{n-1,n}。
  这种当时分配的空间是已经确定的,为n-1+n-2+.....+1

3.2.2 三元组方法

  另一种有可能更加适合的存储计数值的方法为三元组[i,j,c],即对{i,j}对的计数值c(i<j)。对每一个对需要空间3*integer =12 bytes
具体操作为采用类似哈希表的数据结构,其中i,j是搜索键值,这样就能确定对于给定的i,j是否存在对应的三元组,如果是则快速定位。这种方式我们称为存储数值的三元组方式(triples method)
与三角矩阵的方式不同,如果某个项对(候选项对)的计数值为0,则三元组方式可以不用存储这个值,即只有C>0的才需要分配空间去存储。
   结论如下:
如果所有可能出现的(n 2)个项对中有至少1/3出现在购物篮的情况下,三角矩阵方式更优。而如果出现的比例显著小于1/3,那么就要考虑使用三元组方式。

3.2.3 二元组计数

实际当中可能很大的计算复杂性都在二元组,可能二元组的数目更多,所以上面的方法都是用来处理二元组。

四、A-Priori算法

 关联规则中最著名的算法当数Apriori算法。

   

图1、Apriori算法的内存的使用情况,左边为第一步时的内存情况,右图为第二步时内存的使用情况

五、A-Priori算法的改进

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值