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算法相关推荐

  1. 【数据挖掘实验】关联规则——Apriori算法

    一.实验项目名称: 关联规则--Apriori算法 二.实验目的与要求: 在软件方面:会用Clementine软件进行关联规则分析. 在理论方面:Apriori算法. 三.实验原理: 1.Aprior ...

  2. 一步步教你轻松学关联规则Apriori算法

    一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...

  3. python数据分析 - 关联规则Apriori算法

    关联规则Apriori算法 导语 mlxtend实现Apriori算法 导语 关联规则: 是反映一个事物与其他事物之间的相互依存性和关联性 常用于实体商店或在线电商的推荐系统:通过对顾客的购买记录数据 ...

  4. 河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集

    河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集 一.实验目的 二.实验原理 1.Apriori 算法 2.提高频繁项集逐层产生的效率 三.实验内容和步骤 1.实验内容 2.实验步骤 ...

  5. apriori算法_机器学习(无监督学习)关联规则Apriori算法原理与python实现

    关联规则Apriori算法 1.关联规则概述 关联规则算法是在一堆数据集中寻找数据之间的某种关联,通过该算法我们可以对数据集做关联分析--在大规模的数据中寻找有趣关系的任务.这些关系可以有两种形式:频 ...

  6. php关联规则,如何理解关联规则apriori算法

    理解关联规则apriori算法:Apriori算法是第一个关联规则挖掘算法,也是最经典的算法,它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接[类矩阵运算]与剪枝[去掉那些没必 ...

  7. 关联规则Apriori算法 python简单实现

    1.基础知识 本文章主要参看博客 :关联规则Apriori算法 这里只是本人对该博主的代码做了一个简单的修改,能成功运行. 啦啦啦,我只是一个小小的知识搬运工! 2.代码 #加载数据集 import ...

  8. 数据挖掘笔记(5)-关联规则算法Apriori

    1.关联规则概念 如果去超市买东西,我们会发现购买了牛奶的客户很可能会去购买面包,那么"牛奶=>面包"就称之为关联规则,其中牛奶是前项,面包是后项,它们都是项集(单项集). ...

  9. 数据挖掘|关联规则Apriori算法详解及其在中医医案中的应用

    本文简单介绍传统数据挖掘关联规则算法中的Apriori算法,以及在挖掘中医医案辨证规律中的应用.并简单分析传统算法缺点,提出简要的改进思路. 文章目录 一.关联规则简介 二.Apriori算法简介 三 ...

  10. [数据挖掘] 关联规则 Apriori算法实现到PFP(paralled frequent pattern)算法

    数据挖掘--关联规则与Apriori算法 1. 关联分析(Association analysis) 理解: 2. 相关概念 3. Apriori算法查找频繁项集 3.1 Apriori算法的原理: ...

最新文章

  1. MySQL 创建用户与修改密码
  2. 【ZJ选讲·字符串折叠】
  3. 推荐10款纯css3实现的实用按钮
  4. json报文转化为xml报文_JSON与XML互相转化(Jackson)
  5. 安装 ZendServer-CE 可能遇到的问题
  6. Java JDK 自带排序(Arrays.sort(数组名))与自行编写的降序
  7. 朴素的UNIX之-Linux CFS一个注释
  8. WM_QUERYENDSESSION与WM_ENDSESSION
  9. python输出由1234组成的三位素数_编写程序,输出所有由 1 、 2 、 3 、 4 这 4 个数字组成的素数,并且在每个素数中每个数字只使用依次。_学小易找答案...
  10. sublime text3创建文件时生成头部注释
  11. Android入门笔记13
  12. 食住玩|怎么下载安装VRAY渲染器最新版?
  13. 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4
  14. 计算机系统应用 莫军,ARINC653分区操作系统多核处理器任务调度设计
  15. 计算机网络高级工程师证书,网络安全高级工程师的证书??
  16. 运算符和强制类型转换
  17. 火车头采集的文件发布到服务器上,火车头采集器图片采集上传设置
  18. 证明N={1,2,...,n,...}有最大元 黄小宁
  19. c语言sizeof啥作用,C语言中sizeof什么意思
  20. Java 上传--upload

热门文章

  1. 关于Android的ImageView置顶
  2. 公众号管理系统 html,Java SpringBoot+Mybatis Layui+JQuery+html微信公众号后台管理系统...
  3. 字节教育开辟新业务线,推出“闪电搜题”App可拍题和自习
  4. 碳化硅纳米线,SiC纳米线(SiC nanowires),SiC短纤维(SiC fiber),SiC晶须(SiC whiskers)的主要应用方向,检测XRD图谱
  5. Silverlight IReader阅读器第二版
  6. 市场调研策划书_市场调研计划书3篇(资料4)
  7. 树莓派与普通USB摄像头的连接
  8. java对象的实例化_java实例化对象的几种方式
  9. OKR组织敏捷目标和绩效管理第二课 O、KR和案例讲解
  10. matlab电压模块,matlab simpowersystems电路仿真模块.doc