python使用Apriori算法进行关联性解析


Posted in Python onDecember 21, 2017

从大规模数据集中寻找物品间的隐含关系被称作关联分析或关联规则学习。过程分为两步:1.提取频繁项集。2.从频繁项集中抽取出关联规则。

频繁项集是指经常出现在一块的物品的集合。
关联规则是暗示两种物品之间可能存在很强的关系。
一个项集的支持度被定义为数据集中包含该项集的记录所占的比例,用来表示项集的频繁程度。支持度定义在项集上。
可信度或置信度是针对一条诸如{尿布}->{葡萄酒}的关联规则来定义的。这条规则的可信度被定义为“支持度({尿布,葡萄酒})/支持度({尿布})”。

寻找频繁项集

Apriori原理:如果某个项集是频繁的,那么它的所有子集也是频繁的。反过来,如果一个项集是非频繁项集,那么它的所有超集也是非频繁的。

Apriori算法是发现频繁项集的方法。该算法首先生成所有单个物品的项集列表,接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度的项集会被去除掉。然后对剩下来的集合进行组合以生成包含两个元素的项集。接下来重新扫描交易记录,去掉不满足最小支持度的项集,该过程重复进行直到所有项集都被去掉。
Apriori伪代码

当列表中项的个数大于0时:
    检查数据以确认每个项集都是频繁的
    保留频繁项集并构建k+1项组成的候选项集的列表

从频繁项集中挖掘关联规则

当可信度大于最小可信度时,可以认为是含有关联规则的。可以观察到,如果某条规则不满足最小可信度要求,那么该规则的所有子集也不会满足最小可信度要求。
可以首先从一个频繁项集开始,接着创建一个规则列表,其中规则右部只包含一个元素,然后对这些规则进行测试,接下来合并,通过合并所有剩余规则右部来创建新的规则列表,其中规则右部包含两个元素,以此类推。

每个频繁项集:
    while(len(L)>1)
        (k规则列表)
        满足最小置信度
        创建k+1规则

整体代码:

import numpy as np
def loadDataSet():
  return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

def createC1(dateSet):
  c1 = []
  for line in dateSet:
    for item in line:
      if not [item] in c1:
        c1.append([item])
  c1.sort()
  return list(map(frozenset,c1))

def scanData(data,ck,minSupport):#寻找满足最小支持度的项集
  ssCnt = {}
  for tid in data:
    for can in ck:
      if can.issubset(tid):
        if can not in ssCnt.keys():
          ssCnt[can] = 0
        ssCnt[can] += 1
  numItems = len(data)
  retList = []
  supportData = {}
  for key in ssCnt.keys():
    support = ssCnt[key]/numItems
    if support >= minSupport:
      retList.append(key)
    supportData[key] = support
  return retList,supportData


def aprioriGen(Lk,k): #根据k-1项集生成k项集
  retList = []
  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:
        retList.append(Lk[i] | Lk[j])
  return retList

def apriori(dataSet,minSupport = 0.5):#生成频繁项集
  c1 = createC1(dataSet)
  D = list(map(set,dataSet))
  l1,supportData = scanData(D,c1,minSupport)
  L = [l1]
  k = 2
  while(len(L[k-2])>0):
    ck = aprioriGen(L[k-2],k)
    lk,supk = scanData(D,ck,minSupport)
    k = k + 1
    L.append(lk)
    supportData.update(supk)
  return L,supportData
def generaterRules(L,supportData,minConf=0.7):#生成规则
  bigRuleList = []
  for i in range(1,len(L)):
    for freqSet in L[i]:
      H1 = [frozenset([item]) for item in freqSet]
      if i>1:
        rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
      else:
        calcConf(freqSet,H1,supportData,bigRuleList,minConf)
  return bigRuleList
def calcConf(freqSet,H,suppurtData,brl,minConf = 0.7):#计算满足置信度的规则
  prunedH = []
  for conseq in H:
    conf = suppurtData[freqSet]/suppurtData[freqSet-conseq]
    if conf > minConf:
      brl.append((freqSet-conseq,conseq,conf))
      prunedH.append(conseq)
  return prunedH

def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):#递归生成规则
  m = len(H[0])
  if len(freqSet)>=(m+1):
    Hmp1 = calcConf(freqSet,H,supportData,brl,minConf)
    if (len(Hmp1) > 1):
      Hmp1 = aprioriGen(Hmp1,m+1)
      rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)




data = [line.split() for line in open('mushroom.dat').readlines()]
L,support = apriori(data,minSupport=0.3)
for i in range(len(L)):
  for item in L[i]:
    if item & {'2'}:
      print(item)

代码及数据集下载:Apriori

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python实现计算资源图标crc值的方法
Oct 05 Python
Python3.x中自定义比较函数
Apr 24 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python实现读取并显示图片的两种方法
Jan 13 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
Python中过滤字符串列表的方法
Dec 22 Python
Python之基础函数案例详解
Aug 30 Python
python实现kMeans算法
Dec 21 #Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 #Python
python编写朴素贝叶斯用于文本分类
Dec 21 #Python
python并发2之使用asyncio处理并发
Dec 21 #Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 #Python
Python人脸识别初探
Dec 21 #Python
python中判断文件编码的chardet(实例讲解)
Dec 21 #Python
You might like
PHP使用递归生成文章树
2015/04/21 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
详解Vue之事件处理
2020/07/10 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python获取服务器响应cookie的实例
2018/12/28 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
Java面试题及答案
2012/09/08 面试题
广州盈通面试题
2015/12/05 面试题
工艺员岗位职责
2014/02/11 职场文书
国际会计专业求职信
2014/08/04 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis