关联分析:Apriori算法

本文介绍了如何使用Python进行关联规则学习,通过Apriori算法找寻频繁项集,并根据置信度筛选出强关联规则。以中医辨证数据为例,展示了从数据预处理到规则挖掘的全过程,适用于商业场景中的用户行为分析和产品推荐。
部署运行你感兴趣的模型镜像

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》

在这里插入图片描述

  • 步骤1:设定最小支持度和最小置信度
    首先设定最小支持度为2/5,即40%;最小置信度为4/5,即80%。
  • 步骤2:根据最小支持度找出所有的频繁项集
    这一步骤是关联分析中较为重要的一个环节,我们需要找到所有的频繁项集,因为强关联规则都是从频繁项集中产生的。
    举例来说,项集{A,B,C,D}只出现了1次,支持度为1/5,小于最小支持度2/5,该项集就不是频繁项集,这就意味着很难从该项集中挖掘出类似{A,B,C}→{D}的强关联规则,即类似“购买了商品A、B、C的用户也会购买商品D”这样的规则。而项集{B,C}出现了4次,支持度为4/5,大于最小支持度2/5,该项集就属于频繁项集,即商品B和商品C经常同时出现,因此很有可能挖掘出{B}→{C}这样的强关联规则(当然还需要经过步骤3的最小置信度检验),即购买了商品B的用户也会购买商品C,这样就可以向购买了商品B的用户推荐商品C。
    那么该如何快速找到所有的频繁项集呢?最简单的方法就是列出所有项集,然后计算它们的支持度,如果大于等于最小支持度则认定为频繁项集。但是列出所有项集意味着要列出所有的排列组合,如果数据量较大,则会造成巨大的计算量。
    Apriori算法采用了一个精巧的思路来加快运算速度:先计算长度为1的项集,然后挖掘其中的频繁项集;再将长度为1的频繁项集进行排列组合,从中挖掘长度为2的频繁项集,依此类推。其核心逻辑是一个迭代判断的思想:如果连长度为n-1的项集都不是频繁项集,那么就不用考虑长度为n的项集了,也就是说,如果在迭代的过程中发现{A,B,C}不是频繁项集,那么{A,B,C,D}必然不是频繁项集,也就不用去考虑它了。
    在这里插入图片描述
  • 步骤3:根据最小置信度发现强关联规则
    找到所有长度大于1的频繁项集后,强关联规则就很有可能就从这些频繁项集中产生,此时最后一个步骤就是从各个频繁项集中推导出所有可能的关联规则,再利用最小置信度来检验这些关联规则是否为强关联规则。
    举例来说,频繁项集{A,B,C}的非空子集有{A}、{B}、{C}、{A,B}、{A,C}、{B,C},由此可以推导出6条关联规则。
    在这里插入图片描述
    从上表可知,只有规则2满足最小置信度要求,所以得到一条强关联规则{A,C}→{B}。对每个长度大于1的频繁项集进行类似操作,可推导出所有强关联规则,见下表。
    在这里插入图片描述
    至此,我们便得到了9条强关联规则。以第1条强关联规则{A,C}→{B}为例,我们便可以向购买了商品A和商品C的用户推荐商品B,其余依此类推。
# 数据读取与预处理
import pandas as pd
df = pd.read_excel('中医辨证.xlsx')
print(df.head())

symptoms = []
for i in df['病人症状'].tolist(): # 转换为双重列表结构
    symptoms.append(i.split(','))
print(symptoms)

运行结果:
在这里插入图片描述

# 法一:apyori库
from apyori import apriori
rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)
results = list(rules)

for i in results: # 遍历每一个频繁项集
    for j in i.ordered_statistics: # 获取频繁项集的关联规则
        X = j.items_base # 关联规则的前件
        Y = j.items_add # 关联规则的后件
        x = ', '.join([item for item in X]) # 连接前件中的元素
        y = ', '.join([item for item in Y]) # 连接后件中的元素
        if x != '': # 防止关联规则前件为空
            print(x + ' → ' + y) 

运行结果:
在这里插入图片描述

# 法二:mlxtend库
from mlxtend.preprocessing import TransactionEncoder
TE = TransactionEncoder()
data = TE.fit_transform(symptoms) # 将原始数据转换为布尔值

import pandas as pd
df = pd.DataFrame(data, columns=TE.columns_)
print(df.head())

运行结果:
在这里插入图片描述

from mlxtend.frequent_patterns import apriori
items = apriori(df, min_support=0.1, use_colnames=True)
print(items)

# 查看长度大于等于2的频繁项集
print(items[items['itemsets'].apply(lambda x: len(x)) >= 2])

运行结果:
在这里插入图片描述

# 根据最小置信度在频繁项集中挖掘强关联规则
from mlxtend.frequent_patterns import association_rules
rules = association_rules(items, min_threshold=0.7)
print(rules)

运行结果:
在这里插入图片描述

for i, j in rules.iterrows():
    X = j['antecedents']
    Y = j['consequents']
    x = ', '.join([item for item in X])
    y = ', '.join([item for item in Y])
    print(x + ' → ' + y)

运行结果:
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 算法介绍 Apriori算法和FP - Growth算法都是用于关联规则挖掘的经典算法关联规则挖掘旨在从大量数据中发现项集之间的有趣关联关系,在商业智能、市场分析、推荐系统等领域有广泛应用[^1]。 ### 算法原理 - **Apriori算法**:采用“产生 - 测试”的过程。先产生低阶频繁项集(从1开始),再由低阶频繁项集产生高阶候选项集,高阶候选项集经过支持度的度量筛选产生同阶频繁项集。这个过程不断重复,直到无法产生更高阶的频繁项集为止[^1]。 - **FP - Growth算法**:有两个核心。一是采用FP_tree数据结构压缩数据集,完全表示所有事务;二是采用“分而治之”思想,用递归方式将挖掘频繁项集分成各自的子问题来解决。该算法只需要扫描两次数据集,且无需产生候选项集[^1]。 ### 算法应用 关联规则挖掘算法在多个领域有应用,如商业智能领域可用于分析顾客的购买行为,找出商品之间的关联关系,帮助商家进行商品摆放、促销活动策划等;在推荐系统中,可根据用户的历史行为数据挖掘关联规则,为用户推荐可能感兴趣的物品[^1]。 ### 算法对比 - **时间复杂度**:在数据量大、数据分布不均匀、最小支持度阈值较低的情况下,FP - Growth算法Apriori算法好。Apriori算法需要生成大量候选项集,并对每个候选项集进行频繁项集的计数,消耗大量时间和内存;而FP - Growth算法通过构建FP树,将数据集压缩成紧凑的数据结构,大大减少了存储空间和计算时间的开销[^1][2]。 - **空间复杂度**:FP - Growth算法在空间复杂度方面比Apriori算法有数量级级别的优化。Apriori算法生成大量候选项集占用较多空间,FP - Growth算法通过FP树压缩数据,节省了空间[^1]。 - **I/O开销**:Apriori算法需要多次扫描数据集,I/O开销大;FP - Growth算法只需要扫描两次数据集,一次用于构建FP - Tree,另一次用于挖掘频繁项集,大大减少了I/O开销[^1][3]。 ### 代码示例 以下是简单示意代码框架(非完整可运行代码): ```python # Apriori算法示意 def apriori(data, min_support): # 实现Apriori算法逻辑 pass # FP - Growth算法示意 class TreeNode: def __init__(self, name_value, num_occur, parent_node): self.name = name_value self.count = num_occur self.node_link = None self.parent = parent_node self.children = {} def inc(self, num_occur): self.count += num_occur def fp_growth(data, min_support): # 实现FP - Growth算法逻辑 pass ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值