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 import自定义模块方法
Feb 12 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
python3连接MySQL数据库实例详解
May 24 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
python re库的正则表达式入门学习教程
Mar 08 Python
python中open函数的基本用法示例
Sep 07 Python
Pytorch的mean和std调查实例
Jan 02 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 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
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
php判断变量类型常用方法
2012/04/24 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
python文件操作之目录遍历实例分析
2015/05/20 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
django 中QuerySet特性功能详解
2019/07/25 Python
Django--权限Permissions的例子
2019/08/28 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
应聘护士自荐信
2013/10/21 职场文书
祖国在我心中演讲稿
2014/01/15 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
公司合作意向书范文
2014/07/30 职场文书
后勤工作个人总结
2015/02/28 职场文书
大学毕业生自我评价
2015/03/02 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL