关联算法--Apriori和FPGrow算法

使用网上Python算法(Apriori算法和FPGrowth算法),实现关联结果

一、Apriori算法和FPGrowth算法 - 对比综述

    Aprori算法利用频繁集的两个特性(最小支持度和最小置信度),过滤了很多无关的数据集,提高效率。但是我们发现Apriori算法是一个候选消除算法,每一次消除都需要扫描一次所有数据记录,造成整个算法在面临大数据集时显得无能为力。
    FpGrowth算法通过构造一个树结构来压缩数据记录,使得挖掘频繁项集只需要扫描两次数据记录,而且该算法不需要生成候选集合,所以效率会比较高【4】。

二、Apriori算法

1. 概述

    Apriori算法和FPGrowth算法的主要作业就是:利用一些有趣性的量度来识别数据库中发现的强规则【3】。在维基百科中对关联性学习词条信息中有这么一个举例:{洋葱, 土豆}→{汉堡} ,在解释合理性的角度很好理解,洋葱和土豆是汉堡制作必须的食材,此类信息可以作为做出促销定价或产品植入等营销活动决定的根据。(还有著名的【啤酒尿布】案例)。

2. 应用领域

    除了上面购物篮分析中的例子以外,关联规则如今还被用在许多应用领域中,包括网络用法挖掘、入侵检测、连续生产及生物信息学中。与序列挖掘相比,关联规则学习通常不考虑在事务中、或事务间的项目的顺序。

3. Apriori概念

关联分析,主要是通过算法在大规模数据集中寻找频繁项集关联规则

  • 支持度:支持度用来寻找频繁项集,频繁项集在全体数据样本中所占的比例;
  • 置信度:置信度用来确定关联规则,体现为一个数据出现后,另一个数据出现的概率,或者说数据的条件概率;

用一个简单的例子说明。下表是顾客购买记录的数据库D,包含6个事务。项集 I = {网球拍,网球,运动鞋,羽毛球}。考虑关联规则:网球拍==>网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,故,

  • 支持度 support = 3/6 = 0.5
  • 置信度 confident= 3/5 =0.6

    若给定最小支持度alpha =0.5,最小置信度beta =0.6,关联规则网球拍==>网球是有趣的,认为购买网球拍和购买网球之间存在强关联。

TID 网球拍 网球 运动鞋 羽毛球
1 1 1 1 0
2 1 1 0 0
3 1 0 0 0
4 1 0 1 0
5 0 1 1 1
6 1 1 0 0

4. Apriori原理

    如果某个项集是频繁的,那么它的所有子集也是频繁的。反过来,如果一个项集是非频繁集,那么它的所有超集(包含该非频繁集的父集)也是非频繁的。

    根据Apriori原理,我们使用上述例子假设项集{网球拍,羽毛球}是非频繁的,那么它的所有超集,也都是非频繁的,即子集含有{网球拍,羽毛球}的集合。

    在实际计算过程中,一旦计算出{网球拍,羽毛球}的支持度不满足最小支持度,那么就不需要再计算{网球,网球拍,羽毛球}、{运动鞋,网球拍,羽毛球}和{网球,运动鞋,网球拍,羽毛球}的支持度,因为它们也都是非频繁集。

5. Python代码实现Aprirori算法

# -*- coding: utf-8 -*-
# @Time    : 2020/4/24 
# @Author  : li
# @FileName: demo002.py
# @Desc    : Apriori算法实现(关联规则)
# 源码来源:http://www.imooc.com/article/266009

"""
Created on Fri Nov 30 16:38:01 2018

@author: lxh
"""

# 加载数据
def loadDataSet():
    # 1,2等数字分别代表商品1,商品2等
    # 额外举例:['网球拍', '网球', '运动鞋', '羽毛球']
    goodList = [
        ['网球拍', '网球', '运动鞋'],
        ['网球拍', '网球'],
        ['网球拍'],
        ['运动鞋'],
        ['网球', '运动鞋', '羽毛球'],
        ['网球拍', '网球']
    ]
    # return [[1, 2, 3], [1, 2], [1], [3], [2, 3, 4], [1, 2]]
    return goodList


# 发现频繁项集
def createC1(dataSet):
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apriori算法和FP-Growth算法都是关联规则挖掘中常用的算法Apriori算法的原理是通过不断扫描数据集,找出频繁项集,然后由频繁项集产生候选规则,再通过支持度和置信度筛选出强规则。Apriori算法的缺点是需要不断扫描数据集,计算频繁项集,效率较低。 FP-Growth算法的原理是通过构建FP树来表示数据集,然后通过递归的方式挖掘频繁项集。FP-Growth算法的优点是只需要扫描两次数据集,不需要产生候选项集,效率较高。 以下是两个算法Python实现: 1. Apriori算法 ```python def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] 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)) def scanD(D, Ck, minSupport): ssCnt = {} for tid in D: for can in Ck: if can.issubset(tid): if not can in ssCnt: ssCnt[can] = 1 else: ssCnt[can] += 1 numItems = float(len(D)) retList = [] supportData = {} for key in ssCnt: support = ssCnt[key] / numItems if support >= minSupport: retList.insert(0, key) supportData[key] = support return retList, supportData def aprioriGen(Lk, k): retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i+1, lenLk): L1 = list(Lk[i])[:k-2] L2 = list(Lk[j])[:k-2] L1.sort() L2.sort() if L1 == L2: retList.append(Lk[i] | Lk[j]) return retList 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 ``` 2. FP-Growth算法 ```python class treeNode: def __init__(self, nameValue, numOccur, parentNode): self.name = nameValue self.count = numOccur self.nodeLink = None self.parent = parentNode self.children = {} def inc(self, numOccur): self.count += numOccur def disp(self, ind=1): print(' '*ind, self.name, ' ', self.count) for child in self.children.values(): child.disp(ind+1) def createTree(dataSet, minSup=1): headerTable = {} for trans in dataSet: for item in trans: headerTable[item] = headerTable.get(item, 0) + dataSet[trans] for k in list(headerTable.keys()): if headerTable[k] < minSup: del(headerTable[k]) freqItemSet = set(headerTable.keys()) if len(freqItemSet) == 0: return None, None

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值