机器学习9—关联分析之Apriori算法和FP-Growth算法


一、Apriori算法

在机器学习中,除了聚类算法外,Aprior算法也是在数据集中寻找数据之间的某种关联关系,通过该算法,我们可以在大规模的数据中发现有价值的价值,比如著名的啤酒与尿布的案例就是一种关联分析。

1.1Apriori算法原理

1.项集

  • 项集是项的集合,包含k个项的集合称为k项集,如{啤酒,尿布}就是个2项集。
  • 项集在所有事务中出现的次数总和称为绝对支持度或支持度计数。
  • 频繁项集:某项集的支持度计算满足预定的要求即称该项集为频繁项集。

2.关联规则

  • 根据频繁项集挖掘出的结果,例如 {尿布}→{啤酒},规则的左侧称为先导,右侧称为后继
  • 支持度:项集A和B的支持度被定义为数据集中同时包含这两项集的记录所占的比例。(通俗理解,就是事件A和B同时发生的概率),记做:Support(A=>B)=P(A∪B)
  • 可信度(置信度):项集A发生,则项集B发生的概率为关联规则的置信度(通俗理解,在A发生的情况下B发生的概率为多少P(B/A))记做:C o n f i d e n c e ( A = > B ) = P ( B ∣ A )

3.最小支持度和最小置信度

  • 最小支持度:即衡量支持度的一个阈值,表示项集之间的支持度满足该阈值才能证明该支持度有效。
  • 最小置信度:即衡量置信度的一个阈值,表示项集之间的置信度满足该阈值才能证明该置信度有效。
  • 强规则:同时满足最小支持度和最小置信度规则的规则。

4.支持度计数

  • 项集A的支持度计数是事务数据集中包含项集A的事务个数,简称项集的频率或计数
  • 一旦得到项集A 、 B 和 A ∪ B 的支持度计数以及所有事务个数,就可以导出对应的关联规则A = > B和B = > A,并可以检查该规则是否为强规则。

在这里插入图片描述

  • 其中N表示总事务个数,σ表示计数;support可以理解为A,B同时发生的概率,confidence可以理解为条件概率。

1.2Apriori算法实例

关联挖掘的步骤也就只有两个:第一步是找出频繁项集,第二步是从频繁项集中提取规则

Apriori 算法的核心就是:如果某个项集是频繁项集,那么它的全部子集也都是频繁项集。
Ariori算法有两个主要步骤
在这里插入图片描述

  • 以餐饮行业点餐数据为例,首先先将事务数据整理成关联规则模型所需的数据结构。设最小支持度为0.2,将菜品id编号。
    在这里插入图片描述
    计算 1项集,2项集,3项集
    在这里插入图片描述
    简述过程:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.3Apriori算法实例代码演示(用python来写)

import numpy as np
import pandas as pd


def connect_string(x, ms):
    """
    与1项频繁集连接生成新的项集
    :param x: 项集
    :param ms:
    :return: 新的项集
    """
    x = list(map(lambda i: sorted(i.split(ms)), x)) # 将排序得到的i转为列表赋予x
    l = len(x[0])
    r = []
    for i in range(len(x)):
        for j in range(i, len(x)):
            if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:
                r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))
    return r


def find_rule(d, support, confidence, ms=u'-'):
    """
    寻找关联规则
    :param d: 数据集
    :param support: 最小支持度
    :param confidence: 最小置信度
    :param ms: 项集之间连接符号
    :return: 强关联规则以及其支持度与置信度
    """
    # 存储输出结果
    result = pd.DataFrame(index=['support', 'confidence'])

    # 1项集的支持度序列
    support_series = 1.0 * d.sum(axis=0) / d.shape[0]
    # 基于给定的最小支持度进行筛选,得到1项频繁集
    column = list(support_series[support_series > support].index)

    # 当1项频繁集个数大于1时
    k = 0
    while len(column) > 1:
        k = k + 1
        print(u'\n正在进行第%s次搜索...' % k)
        column = connect_string(column, ms)
        print(u'数目:%s...' % len(column))
        # 乘积为1表示两个项集同时发生,乘积为0表示不同发生
        sf = lambda i: d[i].prod(axis=</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白只对大佬的文章感兴趣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值