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的迭代器与生成器实例详解
Jul 16 Python
python正则表达式match和search用法实例
Mar 26 Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
浅谈python中get pass用法
Mar 19 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
python录音并调用百度语音识别接口的示例
Dec 01 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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基础知识:控制结构
2006/12/13 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
php单链表实现代码分享
2016/07/04 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
多广告投放代码 推荐
2006/11/13 Javascript
Prototype使用指南之form.js
2007/01/10 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
Python设计模式之观察者模式实例
2014/04/26 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
自荐信不宜过于夸大
2013/11/06 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
数学检讨书1000字
2014/02/24 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书