引入:

啤酒与尿布的故事
关联规律挖掘:从交易数据中发现:买了X 还会买Y 的规则
关联规律挖掘‘购物篮分析’Market Basket Analysis(MBA)
关联规律->应用于推荐系统

1. 关联规则代码演示

使用的是mlxtend.frequent_patterns.Apriori()

import numpy as np
import pandas as pdfrom mlxtend.frequent_patterns import apriori,association_rules
#TransactionEncoder 事务,编码
#事务:表示事件
#(比如每次去商场购买东西是一次事务,而实际购买到的东西就是项集)
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
X =te.fit_transform(data)
colmns = te.columns_
df = pd.DataFrame(X,columns=colmns)
df.astype(np.uint8)
尿布 橙汁 甜菜 莴苣 葡萄酒 豆奶
0 0 0 0 1 0 1
1 1 0 1 1 1 0
2 1 1 0 0 1 1
3 1 0 0 1 1 1
4 1 1 0 1 0 1
data=[['豆奶','莴苣'],['莴苣','尿布','葡萄酒','甜菜'],['豆奶','尿布','葡萄酒','橙汁'],['莴苣','豆奶','尿布','葡萄酒'],['莴苣','豆奶','尿布','橙汁']]result =apriori(df,min_support=0.6,use_colnames=True)
result
support itemsets
0 0.8 (尿布)
1 0.8 (莴苣)
2 0.6 (葡萄酒)
3 0.8 (豆奶)
4 0.6 (尿布, 莴苣)
5 0.6 (尿布, 葡萄酒)
6 0.6 (尿布, 豆奶)
7 0.6 (莴苣, 豆奶)

关联规则

条目 —》另一些条目之间有关联的

根据关联性强,进行推荐

推荐系统(小公司:分类,)

关联规则的三个计算:
支持度 support
置信度 confidence
提升度 lift

公式计算如下:

association_rules(result,min_threshold=0.5)
antecedents consequents antecedent support consequent support support confidence lift leverage conviction
0 (尿布) (莴苣) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8
1 (莴苣) (尿布) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8
2 (尿布) (葡萄酒) 0.8 0.6 0.6 0.75 1.2500 0.12 1.6
3 (葡萄酒) (尿布) 0.6 0.8 0.6 1.00 1.2500 0.12 inf
4 (尿布) (豆奶) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8
5 (豆奶) (尿布) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8
6 (莴苣) (豆奶) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8
7 (豆奶) (莴苣) 0.8 0.8 0.6 0.75 0.9375 -0.04 0.8

探究关联规则的原始代码

import numpy as np
def createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item]) #store all the item unrepeatlyC1.sort()#return map(frozenset, C1)#frozen set, user can't change it.return list(map(frozenset, C1))def scanD(D,Ck,minSupport):
#参数:数据集、候选项集列表 Ck以及感兴趣项集的最小支持度 minSupportssCnt={}for tid in D:#遍历数据集for can in Ck:#遍历候选项if can.issubset(tid):#判断候选项中是否含数据集的各项#if not ssCnt.has_key(can): # python3 can not supportif not can in ssCnt:ssCnt[can]=1 #不含设为1else: ssCnt[can]+=1#有则计数加1numItems=float(len(D))#数据集大小retList = []#L1初始化supportData = {}#记录候选项中各个数据的支持度for key in ssCnt:support = ssCnt[key]/numItems#计算支持度if support >= minSupport:retList.insert(0,key)#满足条件加入L1中supportData[key] = supportreturn retList, supportDatadef aprioriGen(Lk, k): #组合,向上合并#creates Ck 参数:频繁项集列表 Lk 与项集元素个数 kretList = []lenLk = len(Lk)for i in range(lenLk):for j in range(i+1, lenLk): #两两组合遍历L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]L1.sort(); L2.sort()if L1==L2: #若两个集合的前k-2个项相同时,则将两个集合合并retList.append(Lk[i] | Lk[j]) #set unionreturn retListdef apriori(dataSet, minSupport = 0.5):C1 = createC1(dataSet)D = list(map(set, dataSet)) #python3L1, supportData = scanD(D, C1, minSupport)#单项最小支持度判断 0.5,生成L1L = [L1]k = 2while (len(L[k-2]) > 0):#创建包含更大项集的更大列表,直到下一个大的项集为空Ck = aprioriGen(L[k-2], k)#CkLk, supK = scanD(D, Ck, minSupport)#get LksupportData.update(supK)L.append(Lk)k += 1return L, supportDatadef generateRules(L, supportData, minConf=0.7):#频繁项集列表、包含那些频繁项集支持数据的字典、最小可信度阈值bigRuleList = [] #存储所有的关联规则for i in range(1, len(L)):  #只获取有两个或者更多集合的项目,从1,即第二个元素开始,L[0]是单个元素的# 两个及以上的才可能有关联一说,单个元素的项集不存在关联问题for freqSet in L[i]:H1 = [frozenset([item]) for item in freqSet]#该函数遍历L中的每一个频繁项集并对每个频繁项集创建只包含单个元素集合的列表H1if (i > 1):#如果频繁项集元素数目超过2,那么会考虑对它做进一步的合并rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)else:#第一层时,后件数为1calcConf(freqSet, H1, supportData, bigRuleList, minConf)# 调用函数2return bigRuleListdef calcConf(freqSet, H, supportData, brl, minConf=0.7):#针对项集中只有两个元素时,计算可信度prunedH = []#返回一个满足最小可信度要求的规则列表for conseq in H:#后件,遍历 H中的所有项集并计算它们的可信度值conf = supportData[freqSet]/supportData[freqSet-conseq] #可信度计算,结合支持度数据if conf >= minConf:print (freqSet-conseq,'-->',conseq,'conf:',conf)#如果某条规则满足最小可信度值,那么将这些规则输出到屏幕显示brl.append((freqSet-conseq, conseq, conf))#添加到规则里,brl 是前面通过检查的 bigRuleListprunedH.append(conseq)#同样需要放入列表到后面检查return prunedHdef rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):#参数:一个是频繁项集,另一个是可以出现在规则右部的元素列表 Hm = len(H[0])if (len(freqSet) > (m + 1)): #频繁项集元素数目大于单个集合的元素数Hmp1 = aprioriGen(H, m+1)#存在不同顺序、元素相同的集合,合并具有相同部分的集合Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)#计算可信度if (len(Hmp1) > 1):    #满足最小可信度要求的规则列表多于1,则递归来判断是否可以进一步组合这些规则rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
data=[['豆奶','莴苣'],['莴苣','尿布','葡萄酒','甜菜'],['豆奶','尿布','葡萄酒','橙汁'],['莴苣','豆奶','尿布','葡萄酒'],['莴苣','豆奶','尿布','橙汁']]
L, supportData = apriori(data,minSupport = 0.5)
# 频繁项集
display(L)
#计算
display(supportData)

[[frozenset({‘葡萄酒’}), frozenset({‘尿布’}), frozenset({‘豆奶’}), frozenset({‘莴苣’})],
[frozenset({‘尿布’, ‘豆奶’}),
frozenset({‘尿布’, ‘莴苣’}),
frozenset({‘尿布’, ‘葡萄酒’}),
frozenset({‘莴苣’, ‘豆奶’})],
[]]

{frozenset({‘莴苣’}): 0.8,
frozenset({‘豆奶’}): 0.8,
frozenset({‘尿布’}): 0.8,
frozenset({‘甜菜’}): 0.2,
frozenset({‘葡萄酒’}): 0.6,
frozenset({‘橙汁’}): 0.4,
frozenset({‘莴苣’, ‘豆奶’}): 0.6,
frozenset({‘尿布’, ‘葡萄酒’}): 0.6,
frozenset({‘莴苣’, ‘葡萄酒’}): 0.4,
frozenset({‘尿布’, ‘莴苣’}): 0.6,
frozenset({‘葡萄酒’, ‘豆奶’}): 0.4,
frozenset({‘尿布’, ‘豆奶’}): 0.6,
frozenset({‘尿布’, ‘莴苣’, ‘豆奶’}): 0.4}

 generateRules(L,supportData,minConf=0.8)

[(frozenset({‘葡萄酒’}), frozenset({‘尿布’}), 1.0)]

核心思想简单来说就是 :
1、发现频繁项集过程为
①扫描(扫描所有数据)
②计数(计算各个候选集的支持度)
③比较(选出适合条件的频繁项集)
④产生频繁集
⑤连接、再剪枝产生候选集

2、产生关联规则。过程:根据前面提到的置信度的定义,关联规则的产生如下:
①对于每个频繁项集L,产生L的所有非空子集。
②对于L的每个非空子集S,如果P(L)/P(S)>=min_conf,则输出规则“Sa L-S”。(L-S表示在项集中除去S子集的项集。)

Apriori缺点:
①由频繁k-1项集进行自连接生成的候选频繁k项集数量巨大
②在验证候选频繁k项集的时候需要对整个数据库进行扫描,非常耗时。

更多推荐算法参考:
史上最全机器学习算法(源于逼乎)

【机器学习】 关联规则Apriori和mlxtend——推荐算法相关推荐

  1. python机器学习之基于内容的推荐算法中推荐麻辣香锅菜品实战(附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 推荐算法相信大家都不陌生,日常生活的各种APP都会根据你的喜好和特征来给你推荐,接下来详细介绍一下其中的基于内容的推荐算法 基于内容的模式起源于信 ...

  2. 关联规则挖掘技术——主流推荐算法评述

    链接:http://www.csdn.net/article/a/2011-07-11/301462 啤酒和尿布的购买有关系吗?答案是,跟尿布一起购买最多的商品就是啤酒.据沃尔玛的分析调查,美国的太太 ...

  3. 从原理到实现,详解基于朴素ML思想的协同过滤推荐算法

    作者丨gongyouliu 编辑丨Zandy 来源 | 大数据与人工智能(ID: ai-big-data) 作者在<协同过滤推荐算法>.<矩阵分解推荐算法>这两篇文章中介绍了几 ...

  4. 想要成为推荐算法工程师,都要准备哪些东西

    作者在<推荐算法工程师的成长之道>这篇文章中讲到推荐算法工程师是一个好的职业选择,并且讲解了职业发展路径及定位.怎么成长等话题(还没看的可以看起来). 如果大家认可我讲的并且也愿意将来从事 ...

  5. 推荐算法工程师学习路线及工作指南

    干货!推荐算法工程师学习路线及工作指南 以下文章来源于大数据与人工智能 ,作者gongyouliu 本文从我自己的学习成长经历.如何判断自己是否适合从事推荐算法.推荐算法工程师需要的知识储备.怎么找一 ...

  6. 推荐算法工程师需要掌握哪些核心技能点?

    有幸在去年4月份,被分配到鹅厂推荐组,接触了国内顶尖的算法团队,截止现在自己做推荐也有半年时间了,如果说以前自己的成长速度是线性成长,那么在这半年时间,自己的成长可以说是指数级成长. 鉴于目前工作上越 ...

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

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

  8. 原理 + 代码 | Apriori 算法与基于关联规则的购物篮推荐

    本文的代码与数据可在公众号 " 数据分析与商业实践 " 后台回复 " 0716 " 获取,更多商业实践案例等你来撩 推荐系统将成为未来十年里最重要的变革,社会化 ...

  9. python 数据挖掘 关联规则挖掘 实践 Apriori FP-Tree mlxtend

    1 引言 关联规则分析也成为购物篮分析,最早是为了发现超市销售数据库中不同的商品之间的关联关系.例如一个超市的经理想要更多地了解顾客的购物习惯,比如"哪组商品可能会在一次购物中同时购买?&q ...

最新文章

  1. Windows内核情景分析 笔记
  2. Perl Debug error: SetConsoleMode failed, LastError=|6|
  3. Zygote启动分析
  4. c语言n位水仙花数简书,Kotlin中函数式编程API(8)求阶乘和计算水仙花数
  5. .NET跨平台之旅:将示例站点从ASP.NET 5 Beta7升级至RC1
  6. linux下多路复用模型之Select模型
  7. Web学习第一天:Servlet+JSP简单Demo
  8. 在shell脚本中调用sqlplus
  9. 在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头
  10. MTK:BMT充电模块
  11. 火狐浏览器 附件组件 Xpath 使用
  12. 推荐几个好用的插件(Edge)
  13. 解决 Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足
  14. web前端CSS---关于text-align设置为justify的相关内容
  15. 为什么YUV全为0的图像是绿色的
  16. string split 相关知识
  17. 教学|3DSMAX的mental ray皮肤,3S材质的制作和使用方法
  18. 图片去水印软件分享!这三个好用的软件不能错过!​
  19. OSI七层网络、TCP/IP五层网络架构、二层/三层网络
  20. matlab结果输出到文本的方法

热门文章

  1. 简单 3 步实现高效编程
  2. Docker : 数据卷(创建、挂载、查看、删除)
  3. shiro管理下MD5加密的使用
  4. Bootstrap简介
  5. Django:学习笔记(2)——创建第一个应用
  6. ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
  7. BZOJ 1567: [JSOI2008]Blue Mary的战役地图
  8. 十天学Linux内核之第七天---电源开和关时都发生了什么
  9. ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码
  10. Interesting Finds: 2008.03.24