数据挖掘十大算法(七):Apriori算法

本文详细介绍了Apriori算法,一种用于发现频繁项集和关联规则的方法。Apriori原理用于从大规模数据中筛选频繁项集,通过设定最小支持度来过滤不相关项。接着,文章探讨了如何从频繁项集中挖掘关联规则,并指出一条规则的可信度对其子集的影响。最后,提到虽然sklearn库中未提供Apriori API,但整个过程有助于理解关联分析在零售等领域的应用。

一,基本原理和Python实现

1.关联分析

关联分析是一种在大规模数据集中寻找有趣关系的任务。这种关系表现为两种形式:

1.频繁项集(frequency item sets):经常同时出现的一些元素的集合;
2.关联规则(association rules): 意味着两种元素之间存在很强的关系。

在这里插入图片描述
频繁项集是指经常出现在一起的元素的集合,上表中的集合 {葡萄酒,尿布,豆奶} 就是频繁项集的一个例子。同样可以找到如 “尿布 --> 葡萄酒”的关联规则,意味着如果有人买了尿布,就很可能也会买葡萄酒。使用频繁项集和关联规则,商家可以更好地理解顾客的消费行为,所以大部分关联规则分析示例来自零售业。

理解两个重要的概念:
在这里插入图片描述

2. Apriori 原理

假设经营了一家杂货店,于是我们对那些经常在一起购买的商品非常感兴趣。假设我们只有 4 种商品:商品0,商品1,商品 2,商品3. 那么如何得可能被一起购买的商品的组合?
在这里插入图片描述
上图显示了物品之间所有可能的组合,从上往下一个集合是 Ø,表示不包含任何物品的空集,物品集合之间的连线表明两个或者更多集合可以组合形成一个更大的集合。

在这里插入图片描述
在这里插入图片描述

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

上面提到,关联分析的两个目标:发现频繁项集和发现关联规则。首先需要找到频繁项集,然后根据频繁项集获得关联规则。首先来讨论发现频繁项集。Apriori 是发现频繁项集的一种方法。

Apriori算法的两个输入参数分别是最小支持度和数据集。
首先会生成所有单个物品的项集列表;
扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的集合会被去掉;
对剩下的集合进行组合以生成包含两个元素的项集;
接下来重新扫描交易记录,去掉不满足最小支持度的项集,重复进行直到所有项集都被去掉。

伪代码:

对数据集中的每条交易记录tran:
对每个候选项集can:
	检查一下can是否是tran的子集:
	如果是,则增加can的计数值

对每个候选项集:
如果其支持度不低于最低值,则保留
返回所有频繁项集列表
"""
Apriori exercise.
Created on Fri Nov 27 09:16:03 2019

@author: NanShan
"""


def loadDataSet():
    '''创建一个用于测试的简单的数据集'''
    return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]


def createC1(dataSet):
    '''
    构建初始候选项集的列表,即所有候选项集只包含一个元素,
    C1是大小为1的所有候选项集的集合
    '''
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if [item] not in C1:
                C1.append([item])
    C1.sort()
    return list(map(frozenset, C1))  # frozenset就是不可变集合


def scanD(D, C1, minSupport):
    '''
    计算C1中的项集在数据集合D(记录或者transactions)中的支持度,
    返回满足最小支持度的项集的集合,和所有项集支持度信息的字典。
    '''
    ssCnt = {
   
   }
    # 对于每一条transaction
    for tid in D:
        # 对于每一个候选项集can,检查是否是transaction的一部分
        # 即该候选can是否得到transaction的支持
        for can in C1:
            if can.issubset(tid):
                ssCnt[can] = ssCnt.get(can, 0) + 1

    numItems = float(len(D))
    retList = []
    supportData = {
   
   }
    for key in ssCnt:
        # 每个项集的支持度
        support = ssCnt[key] / numItems

        # 将满足最小支持度的项集,加入retList
        if support >= minSupport:
            retList.append(key)

        # 汇总支持度数据
        supportData[key] = support
    return retList, supportData

if __name__ == '__main__':
    # 导入数据集
    myDat = loadDataSet()
    # 构建第一个候选项集列表C1
    C1 = createC1(myDat)
    print('第一个候选集列表:', C1)

    # 构建集合表示的数据集 D
    data = list(map(set, myDat))   # 现在的map函数,如果外面没有list返回的是一个对象
    print('原始数据:', data)

    # 选择出支持度不小于0.5 的项集作为频繁项集
    L1, suppData = scanD(data, C1, 0.5)

    print("频繁项集L1:", L1)

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值