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多线程threading.Lock锁用法实例
Nov 01 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
python实现简易内存监控
Jun 21 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
Python最小二乘法矩阵
Jan 02 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
python实现查找所有程序的安装信息
Feb 18 Python
Python grequests模块使用场景及代码实例
Aug 10 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
Python实现天气查询软件
Jun 07 Python
python自动计算图像数据集的RGB均值
Jun 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
php生成无限栏目树
2017/03/16 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
js a标签点击事件
2017/03/30 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Python实现统计单词出现的个数
2015/05/28 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
python通过zabbix api获取主机
2018/09/17 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
使用Python发现隐藏的wifi
2020/03/04 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
推荐信格式要求
2014/05/09 职场文书
合伙开公司协议书范本
2014/10/28 职场文书