[数据挖掘笔记01] 关联规则Apriori算法
1.原理
关联规则用来找出事物之间的关联性,比如“如果小明买了面包,那么他也会买果汁”,下面我们通过一个实例来理解关联规则。
有这样一个交易数据集D,最小支持度为0.3,最小置信度为0.7,要求我们基于这个数据集求出商品间的关联规则。
这里需要引入两个概念:
- 支持度:Support(X) = X在数据集中出现的次数数据集的条数\frac{X在数据集中出现的次数}{数据集的条数}数据集的条数X在数据集中出现的次数
- 置信度:Confidence(X => Y) = 在有X的交易项中Y出现的次数X在数据集中出现的次数\frac{在有X的交易项中Y出现的次数}{X在数据集中出现的次数}X在数据集中出现的次数在有X的交易项中Y出现的次数
比如对于{牛肉}和{鸡肉},牛肉在数据集中出现的次数为4,那么Support({牛肉}) = 47\frac{4}{7}74,鸡肉在数据集中出现的次数为5,那么Support({鸡肉}) = 57\frac{5}{7}75。
在有牛肉的交易项中,鸡肉出现的次数为3,那么置信度Confidence({牛肉} => {鸡肉}) = 34\frac{3}{4}43 = 0.75。
(1)扫描数据集D,计算1-项集的支持度,筛选出频繁1-项集
最小支持度为0.3,交易条数为7,因此只要支持度计数大于 0.3 * 7 = 2.1,该项就是频繁项集。
(2)根据频繁1-项集,连接生成候选2-项集,筛选出频繁2-项集
(3)根据频繁2-项集,连接生成候选3-项集,筛选出频繁3-项集
(4)计算置信度,生成强关联规则
如果一条关联规则的置信度 >= 最小置信度,我们就说这条关联规则是强关联规则。
对于频繁3-项集{牛奶,鸡肉,衣服}:
对于频繁2-项集{牛肉,鸡肉}:
其他关联规则的计算同理,依次计算就可以得出所有的关联规则。
2.代码实现
(1)原生代码
def load_data_set():data_set = [['牛肉','鸡肉','牛奶'],['牛肉','奶酪'],['奶酪','靴子'],['牛肉','鸡肉','奶酪'],['牛肉','鸡肉','衣服','奶酪','牛奶'],['鸡肉','衣服','牛奶'],['鸡肉','牛奶','衣服']]return data_set'''创建候选1-项集'''
def create_C1(data_set):C1 = set() #1项集for t in data_set: #遍历for item in t:item_set = frozenset([item]) #转换为不可变集合C1.add(item_set) #加入1项集中return C1'''判断频繁项集'''
def is_apriori(Ck_item, Lksub1):for item in Ck_item: #遍历候选项集sub_Ck = Ck_item - frozenset([item]) #从候选项集中减去一项if sub_Ck not in Lksub1: #如果该项集不在频繁(k-1)-项集中,则返回Falsereturn Falsereturn True'''创建候选k-项集'''
def create_Ck(Lksub1, k):#Lksub1: 频繁(k-1)-项集Ck = set() #候选k-项集len_Lksub1 = len(Lksub1)list_Lksub1 = list(Lksub1)for i in range(len_Lksub1): #遍历for j in range(1, len_Lksub1):l1 = list(list_Lksub1[i])l2 = list(list_Lksub1[j])l1.sort()l2.sort()if l1[0:k-2] == l2[0:k-2]: #l1和l2的前n-1项如果相同Ck_item = list_Lksub1[i] | list_Lksub1[j] #取并集if is_apriori(Ck_item, Lksub1): #如果属于频繁(k-1)-项集Ck.add(Ck_item) #添加到候选项集中return Ck'''筛选出频繁项集'''
def generate_Lk_by_Ck(data_set, Ck, min_support, support_data):Lk = set() #频繁k-项集item_count = {} #计数集for t in data_set: #遍历数据集for item in Ck: #遍历候选k-项集if item.issubset(t): #如果item是t的子集if item not in item_count: #如果item不在item_count中item_count[item] = 1else:item_count[item] += 1t_num = float(len(data_set)) #交易条数for item in item_count:if (item_count[item] / t_num) >= min_support: #如果支持度大于等于最小支持度Lk.add(item) #加入到频繁k-项集中support_data[item] = item_count[item] / t_num #支持度数据return Lk'''迭代计算频繁项集和支持度'''
def generate_L(data_set, k, min_support):support_data = {} #支持度计数C1 = create_C1(data_set) #建立候选1-项集L1 = generate_Lk_by_Ck(data_set, C1, min_support, support_data) #生成频繁1-项集Lksub1 = L1.copy() #复制一份L = [] #总频繁项集L.append(Lksub1) #加入频繁1-项集for i in range(2, k+1): Ci = create_Ck(Lksub1, i) #生成候选i-项集Li = generate_Lk_by_Ck(data_set, Ci, min_support, support_data) #生产频繁i-项集Lksub1 = Li.copy() #复制一份L.append(Lksub1) #加入频繁i-项集return L, support_data'''生成关联规则'''
def generate_related_rules(L, support_data, min_conf):related_rule_list = []sub_set_list = []for i in range(0, len(L)): #遍历总频繁项集for freq_set in L[i]: #遍历单个频繁项集for sub_set in sub_set_list: #遍历子集列表if sub_set.issubset(freq_set): #如果子集是频繁项集的子集#置信度 = 频繁项集的支持度 / 包含剩下项集的项集的支持度conf = support_data[freq_set] / support_data[freq_set - sub_set]related_rule = (freq_set - sub_set, sub_set, conf) #关联规则if conf >= min_conf and related_rule not in related_rule_list:#print(freq_set - sub_set, "==>", sub_set, "conf:", conf)related_rule_list.append(related_rule) #强关联规则sub_set_list.append(freq_set) #加入频繁项集到子集列表return related_rule_listif __name__ == '__main__':#加载数据集data_set = load_data_set()#生成频繁项集和支持度L, support_data = generate_L(data_set, k=3, min_support=0.3)#生成关联规则related_rules_list = generate_related_rules(L, support_data, min_conf=0.7)#遍历输出for Lk in L:print("=" * 60)print("frequent " + str(len(list(Lk)[0])) + "-itemsets\t\tsupport")print("=" * 60)for freq_set in Lk:print(freq_set, support_data[freq_set])print("=" * 60) print("Related Rules")for item in related_rules_list:print(item[0], "=>", item[1], "conf:", item[2])
运行结果:
(2)使用efficient_apriori库
通过命令行安装
pip install efficient-apriori
之后就可以运行如下代码
from efficient_apriori import aprioridata_set = [['牛肉','鸡肉','牛奶'],['牛肉','奶酪'],['奶酪','靴子'],['牛肉','鸡肉','奶酪'],['牛肉','鸡肉','衣服','奶酪','牛奶'],['鸡肉','衣服','牛奶'],['鸡肉','牛奶','衣服']]itemsets, rules = apriori(data_set, min_support=0.3, min_confidence=0.7)
print(itemsets) #生成频繁项集的支持度计数集
print("\n")
print(rules) #生成关联规则
运行结果:
3.实战
我们知道王家卫是一个有名的香港导演,看过他的电影的人应该都知道,他来来去去就是用那几个演员,比如梁朝伟、张国荣、张曼玉,现在我们就用关联规则来看看墨镜王是怎么选用演员的。
首页要将参演王家卫电影的演员爬下来,我们打开王家卫的360百科,可以看到王家卫执导的电影和电影的演员。我们需要把电影名称和主要演员扒拉下来。
这是爬取到的结果:
爬取到演员列表,就可以使用efficient_apriori库进行关联规则挖掘了,代码如下:
import requests
from lxml import etree
from requests.exceptions import RequestException
from efficient_apriori import aprioridata_dict = {}def get_html():url = 'https://baike.so.com/doc/1517409-1604273.html'headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36"}try:response = requests.get(url,headers=headers)if response.status_code == 200:return response.content.decode('utf-8')return Noneexcept RequestException:return Nonedef parse_html(html):xpath_html = etree.HTML(html)for item in xpath_html.xpath('//div[@id="main-content-text"]/div[2]/div[1]//tr[td]')[:-1]:if item.xpath('./td')[1].text:movie = item.xpath('./td')[1].textelse:movie = item.xpath('./td/a')[0].textif movie == '东邪西毒':actors_list =[x.text for x in item.xpath('./td[2]//a')]else:actors_list =[x.text for x in item.xpath('./td[3]//a')]data_dict[movie] = actors_listreturn data_dictif __name__ == '__main__':html = get_html()parse_html(html)print(data_dict)print("\n")data_set = [item[1] for item in data_dict.items()]print(data_set)print("\n")itemsets, rules = apriori(data_set, min_support=0.3, min_confidence=0.6)print(itemsets)print("\n")print(rules)
运行结果:
梁朝伟、刘嘉玲、张曼玉、张学友、张国荣是王家卫最喜欢用的演员,其中梁朝伟出演电影次数达8次,可以说是御用演员了。
[数据挖掘笔记01] 关联规则Apriori算法相关推荐
- 【数据挖掘实验】关联规则——Apriori算法
一.实验项目名称: 关联规则--Apriori算法 二.实验目的与要求: 在软件方面:会用Clementine软件进行关联规则分析. 在理论方面:Apriori算法. 三.实验原理: 1.Aprior ...
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
- python数据分析 - 关联规则Apriori算法
关联规则Apriori算法 导语 mlxtend实现Apriori算法 导语 关联规则: 是反映一个事物与其他事物之间的相互依存性和关联性 常用于实体商店或在线电商的推荐系统:通过对顾客的购买记录数据 ...
- 河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集
河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集 一.实验目的 二.实验原理 1.Apriori 算法 2.提高频繁项集逐层产生的效率 三.实验内容和步骤 1.实验内容 2.实验步骤 ...
- apriori算法_机器学习(无监督学习)关联规则Apriori算法原理与python实现
关联规则Apriori算法 1.关联规则概述 关联规则算法是在一堆数据集中寻找数据之间的某种关联,通过该算法我们可以对数据集做关联分析--在大规模的数据中寻找有趣关系的任务.这些关系可以有两种形式:频 ...
- php关联规则,如何理解关联规则apriori算法
理解关联规则apriori算法:Apriori算法是第一个关联规则挖掘算法,也是最经典的算法,它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接[类矩阵运算]与剪枝[去掉那些没必 ...
- 关联规则Apriori算法 python简单实现
1.基础知识 本文章主要参看博客 :关联规则Apriori算法 这里只是本人对该博主的代码做了一个简单的修改,能成功运行. 啦啦啦,我只是一个小小的知识搬运工! 2.代码 #加载数据集 import ...
- 数据挖掘笔记(5)-关联规则算法Apriori
1.关联规则概念 如果去超市买东西,我们会发现购买了牛奶的客户很可能会去购买面包,那么"牛奶=>面包"就称之为关联规则,其中牛奶是前项,面包是后项,它们都是项集(单项集). ...
- 数据挖掘|关联规则Apriori算法详解及其在中医医案中的应用
本文简单介绍传统数据挖掘关联规则算法中的Apriori算法,以及在挖掘中医医案辨证规律中的应用.并简单分析传统算法缺点,提出简要的改进思路. 文章目录 一.关联规则简介 二.Apriori算法简介 三 ...
- [数据挖掘] 关联规则 Apriori算法实现到PFP(paralled frequent pattern)算法
数据挖掘--关联规则与Apriori算法 1. 关联分析(Association analysis) 理解: 2. 相关概念 3. Apriori算法查找频繁项集 3.1 Apriori算法的原理: ...
最新文章
- MySQL 创建用户与修改密码
- 【ZJ选讲·字符串折叠】
- 推荐10款纯css3实现的实用按钮
- json报文转化为xml报文_JSON与XML互相转化(Jackson)
- 安装 ZendServer-CE 可能遇到的问题
- Java JDK 自带排序(Arrays.sort(数组名))与自行编写的降序
- 朴素的UNIX之-Linux CFS一个注释
- WM_QUERYENDSESSION与WM_ENDSESSION
- python输出由1234组成的三位素数_编写程序,输出所有由 1 、 2 、 3 、 4 这 4 个数字组成的素数,并且在每个素数中每个数字只使用依次。_学小易找答案...
- sublime text3创建文件时生成头部注释
- Android入门笔记13
- 食住玩|怎么下载安装VRAY渲染器最新版?
- 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4
- 计算机系统应用 莫军,ARINC653分区操作系统多核处理器任务调度设计
- 计算机网络高级工程师证书,网络安全高级工程师的证书??
- 运算符和强制类型转换
- 火车头采集的文件发布到服务器上,火车头采集器图片采集上传设置
- 证明N={1,2,...,n,...}有最大元 黄小宁
- c语言sizeof啥作用,C语言中sizeof什么意思
- Java 上传--upload
热门文章
- 关于Android的ImageView置顶
- 公众号管理系统 html,Java SpringBoot+Mybatis Layui+JQuery+html微信公众号后台管理系统...
- 字节教育开辟新业务线,推出“闪电搜题”App可拍题和自习
- 碳化硅纳米线,SiC纳米线(SiC nanowires),SiC短纤维(SiC fiber),SiC晶须(SiC whiskers)的主要应用方向,检测XRD图谱
- Silverlight IReader阅读器第二版
- 市场调研策划书_市场调研计划书3篇(资料4)
- 树莓派与普通USB摄像头的连接
- java对象的实例化_java实例化对象的几种方式
- OKR组织敏捷目标和绩效管理第二课 O、KR和案例讲解
- matlab电压模块,matlab simpowersystems电路仿真模块.doc