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通过定义一个类实例作为ftp回调方法
May 04 Python
Python操作json的方法实例分析
Dec 06 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
May 27 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
Python requests模块安装及使用教程图解
Jun 30 Python
Django框架安装及项目创建过程解析
Sep 14 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Python词云的正确实现方法实例
May 08 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 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
一个取得文件扩展名的函数
2006/10/09 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
详解Python中的条件判断语句
2015/05/14 Python
浅谈五大Python Web框架
2017/03/20 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python学习笔记之装饰器
2020/08/06 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
佳能英国官方网站:Canon UK
2017/08/08 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
小学校园活动策划
2014/01/30 职场文书
安全责任书范文
2014/08/25 职场文书
自我查摆剖析材料
2014/10/11 职场文书
小学运动会通讯稿
2015/07/18 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
详解Django的MVT设计模式
2021/04/29 Python
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
python数据处理之Pandas类型转换
2022/04/28 Python