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 相关文章推荐
Php多进程实现代码
May 07 Python
Python中的单继承与多继承实例分析
May 10 Python
django用户登录和注销的实现方法
Jul 16 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
Django 对IP访问频率进行限制的例子
Aug 30 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
python颜色随机生成器的实例代码
Jan 10 Python
python实现在一个画布上画多个子图
Jan 19 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
浅谈Python中的函数(def)及参数传递操作
May 25 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 远程图片保存到本地的函数类
2008/12/08 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
jquery 常用操作方法
2010/01/28 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
小学生开学感言
2014/02/28 职场文书
应届生求职信范文
2014/05/26 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2016年公司新年寄语
2015/08/17 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
python中urllib包的网络请求教程
2022/04/19 Python
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技