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使用PIL库实现验证码图片的方法
Mar 11 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
实例讲解Python爬取网页数据
Jul 08 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
python读写配置文件操作示例
Jul 03 Python
pytorch 输出中间层特征的实例
Aug 17 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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/03/17 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
如何基于python生成list的所有的子集
2019/11/11 Python
Python模块 _winreg操作注册表
2020/02/05 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
控制工程专业个人求职信
2013/09/25 职场文书
应届生骨科医生求职信
2013/10/31 职场文书
学生党员思想汇报
2013/12/28 职场文书
生产部岗位职责范文
2014/02/07 职场文书
联欢晚会主持词
2014/03/25 职场文书
美食节策划方案
2014/05/26 职场文书
怎样写离婚协议书
2014/09/10 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
信息合作协议书
2014/10/09 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
奠基仪式致辞
2015/07/30 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
javascript对象3个属性特征
2021/11/17 Javascript
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技