4.1 Apriori算法简介

联规则挖掘是数据挖掘中最活跃的研究方法之一 。最早是由 Agrawal 等人提出的1993最初提出的动机是针对购物篮分析问题提出的,其目的是为了发现交易数据库中不同商品之间的联系规则。这些规则刻画了顾客购买行为模式,可以用来指导商家科学地安排进货,库存以及货架设计等。之后诸多的研究人员对关联规则的挖掘问题进行了大量的研究。他们的工作涉及到关联规则的挖掘理论的探索,原有的算法的改进和新算法的设计,并行关联规则挖掘Parallel Association Rule Mining,以及数量关联规则挖掘Quantitive Association Rule Mining 等问题。在提高挖掘规则算法的效率、适应性、可用性以及应用推广等方面,许多学者进行了不懈的努力。

Apriori算法是种挖掘关联规则的频繁项集算法,一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。Apriori算法已经被广泛的应用到商业、网络安全等各个领域。Apriori算法采用了逐层搜索的迭代的方法,算法简单明了,没有复杂的理论推导,也易于实现。但其有一些难以克服的缺点如1.对数据库的扫描次数过多。2.Apriori算法会产生大量的中间项集。3.采用唯一支持度。4.算法的适应面窄。

4.2 算法的基本原理

(1)关联分析

关联分析是一种在大规模数据集中寻找有趣关系的任务。这些关系可以有两种形式:频繁项集或者关联规则。频繁项集(fequentitemsets)是经常出现在一块的物品的集合,关联规则(association rules)暗示两种物品之间可能存在很强的关系。下面会用一个例子来说明这两种概念。

频繁项集是指那些经常出现在一起的物品集合,表1中的集合{葡萄酒,尿布,豆奶}就是频繁项集的一个例子(回想一下,集合是由一对大括号“{}”来表示的)。从上面的数据集中也可以找到诸如尿布->葡萄酒的关联规则。这意味着如果有人买了尿布,那么他很可能也会买葡萄酒。使用频繁项集和关联规则,商家可以更好地理解他们的顾客。尽管大部分关联规则分析的实例来自零售业,但该技术同样可以用于其他行业,比如网站流量分析以及医药行业。

一个项集的支持度(support)被定义为数据集中包含该项集的记录所占的比例。从表1中可以得到,{豆奶}的支持度为4/5。而在5条交易记录中有3条包含{豆奶,尿布},因此{豆奶,尿布}的支持度为3/5。支持度是针对项集来说的,因此可以定义一个最小支持度,而只保留满足最小支持度的项集。可信度或置信度(confidence)是针对一条诸如{尿布}→{葡萄酒}的关联规则来定义的。这条规则的可信度被定义为“支持度({尿布,葡萄酒})/支持度({尿布})”。从表1中可以看到,由于{尿布,葡萄酒}的支持度为3/5,尿布的支持度为4/5,所以“尿布一葡萄酒”的可信度为3/4=0.75。这意味着对于包含“尿布”的所有记录,我们的规则对其中75%的记录都适用。

关联规则学习是一种在大型数据集中寻找有趣关系的方法。这种关系通常表现为项集之间的强关联性,即如果某个项集(集合中的一组项)在数据集中频繁出现,那么另一个项集也很有可能随之出现。关联规则学习的主要目标是找出这样的项集,并生成形如“如果购买了A商品,那么也可能会购买B商品”的规则。在关联规则学习中,通常使用支持度和置信度这两个指标来量化项集之间的关联性。

表1 交易清单

交易号码

商品

0

豆奶,莴苣

1

莴苣,尿布,葡萄酒,甜菜

2

豆奶,尿布,葡萄酒,橙汁

3

莴苣,豆奶,尿布,葡萄酒

4

莴苣,豆奶,尿布,橙汁

  1. Apriori原理

关联规则学习领域,Apriori算法是一种广泛应用的算法。该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递归的方法。

4.3 算法实例

本实验以某生鲜超市的商品交易表单为数据,通过Apriori算法分析顾客的购买行为,发现隐含的购物特点,从而为超市采购和上货提供有价值的建议。Apriori算法的重要性在于它提供了一种有效的手段来发现数据中的关联关系。与其他算法相比,Apriori算法具有较低的计算复杂度和较高的准确性,使得它成为关联规则学习中的首选算法之一。实例操作可分为以下五个过程。1.收集数据:可以使用任何方法。2.导入相关库和数据集。3.生成候选项集。4.使用Apriori算法来发现频繁集。5.从频繁项集中挖掘关联规则。

  1. 收集数据

2是某生鲜超市的商品交易表单,为便于数据处理与分析,现将表单中的商品信息进行数字化编码,1代表青椒,2代表西红柿,3代表面条,4代表馒头,5代表鸡蛋,具体内容如表3。

表2 商品交易表单

交易号码

商品

A01

青椒,面条,馒头

A02

西红柿,面条,鸡蛋

A03

青椒,西红柿,面条,鸡蛋

A04

西红柿,鸡蛋

表3 商品交易数据表单

交易号码

商品

A01

1,3,4

A02

2,3,5

A03

1,2,3,5

A04

2,5

  1. 导入相关库和数据集

loadDataSet函数,此函数的作用是返回一个二维列表,该列表里包含了商品交易数据表单的内容同时为下一步生成候选项集以及发现频繁集和从频繁项集中挖掘关联规则,提供数据支持。

图1 导入相关库和数据集

相关代码如下:

def loadDataSet():

    return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]

  1. 生成候选项集

createC1函数在Apriori算法中起到了生成初始候选项集(即1-项集)的关键作用。该函数接收一个数据集dataSet作为输入,其主要目的是从数据集中提取所有不同的单个项,并将这些单个项转换为frozenset类型的集合,最终返回一个包含所有1-项集的列表。

图2 生成候选项集

相关代码如下:

def createC1(dataSet):

    C1 = []

    for transaction in dataSet:

        for item in transaction:

            if not [item] in C1:

                C1.append([item])

    C1.sort()

    return list(map(frozenset, C1))

  1. 使用Apriori算法来发现频繁集

Apriori函数是Apriori算法的核心实现,它的主要作用是从给定的数据集中挖掘出所有满足最小支持度阈值的频繁项集,并返回这些频繁项集以及它们对应的支持度。Apriori函数为后续挖掘关联规则提供了基础,因为关联规则的生成是基于频繁项集进行的。通过该函数,可以找到数据集中经常一起出现的项的组合,从而发现数据中的潜在规律和模式。

图3 使用Apriori算法来发现频繁集

相关代码如下:

def apriori(dataSet, minSupport = 0.5):

    C1 = createC1(dataSet)

    D = list(map(set, dataSet))

    L1, supportData = scanD(D, C1, minSupport)

    L = [L1]

    k = 2

    while (len(L[k-2]) > 0):

        Ck = aprioriGen(L[k-2], k)

        Lk, supK = scanD(D, Ck, minSupport)

        supportData.update(supK)

        L.append(Lk)

        k += 1

    return L, supportData

  1. 从频繁项集中挖掘关联规则

generateRules函数的主要作用是基于Apriori算法挖掘出的频繁项集,生成满足最小置信度阈值的关联规则。该函数是Apriori算法中关联规则挖掘的核心部分,它可以帮助我们从频繁项集中发现有意义的关联关系,例如在购物篮分析中,找出哪些商品经常一起被购买,从而为商家提供营销策略建议,如商品摆放、促销活动等。

图4 从频繁项集中挖掘关联规则

相关代码如下:

def generateRules(L, supportData, minConf=0.7):

    bigRuleList = []

    for i in range(1, len(L)):

        for freqSet in L[i]:

            H1 = [frozenset([item]) for item in freqSet]

            if (i > 1):

                rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)

            else:

                calcConf(freqSet, H1, supportData, bigRuleList, minConf)

    return bigRuleList

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐