关联算法--Apriori和FPGrow算法

本文对比介绍了Apriori和FPGrowth两种关联算法,详细阐述了Apriori的概念、原理及Python实现,以及FPGrowth的基本思想。Apriori算法依赖频繁集的特性,但对大数据集效率较低;而FPGrowth通过构造FP树提高效率,减少数据扫描次数。文章还提供了Python代码实现示例。
摘要由CSDN通过智能技术生成

使用网上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(
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值