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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
python 七种邮件内容发送方法实例
Apr 22 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Django的信号机制详解
May 05 Python
python远程连接MySQL数据库
Apr 19 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
python中return如何写
Jun 18 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
Python Parser的用法
May 12 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从FLV文件获取视频预览图的方法
2015/03/12 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
Gird事件机制初级读本
2007/03/10 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
python多线程之事件Event的使用详解
2018/04/27 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python实现简单的五子棋游戏
2020/09/01 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
python 通过exifread读取照片信息
2020/12/24 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
调解员先进事迹材料
2014/02/07 职场文书
保护环境标语
2014/06/09 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
社会发展项目建议书
2014/08/25 职场文书
个人先进事迹总结
2015/02/26 职场文书
会计工作能力自我评价
2015/03/05 职场文书
二十年同学聚会感言
2015/07/30 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript