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 相关文章推荐
python关键字and和or用法实例
May 28 Python
深入理解python try异常处理机制
Jun 01 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python语言生成水仙花数代码示例
Dec 18 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
php新建文件的方法实例
2019/09/26 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
js实现文字截断功能
2016/09/14 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
Python 模板引擎的注入问题分析
2017/01/01 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
在python shell中运行python文件的实现
2019/12/21 Python
详解python如何引用包package
2020/06/07 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
数控技术学生的自我评价
2014/02/15 职场文书
商业融资计划书
2014/04/29 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
大学生党员自我评价
2015/03/04 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis