Apriori算法

  • 优点:易编码实现
  • 缺点:在大数据集上可能较慢
  • 适用数据类型:数值型或者标称型

算法过程:

关联分析是一种在大规模数据集中寻找有意思的关系的任务,这里的有意思的关系有两种:频繁项集(frequent item sets)或关联规则(association rules)。
支持度(support):一个项集的支持度被定义为数据集中该项集的记录所占的比例。
置信度(confidence):关联规则A->B的置信度表示为support(A,B)/support(A)

单纯暴力做的话有2^n-1个组合
Apriori原理:如果某个项集是频繁的那么它的子项集也是频繁的。
反过来看就是说一个项如果不是频繁项的话,那么包含他的项也不是频繁项

这里主要是两个过程:
1.生成频繁项集:

这是一个挺简单的过程就是两个集合C、L来回倒,C就是通过初选的集合(像是最原始的啊,组合出来的啊);L是通过支持度筛选的集合。过程大体如下:
1.根据原始数据集构建单个项组成的集合C1
2.根据C1计算L1
3.找出L1中可以的合并的得到C2
4.重复上述C2 -> L2 -> C3 ->.....->Ck -> Lk

2.推导出关联规则:

通过上一步得到的频繁项集,我们就只需要吧每个频繁项集里能够列出的规则都列出来,然后计算置信度,选出置信度符合要求的就可以了。

函数:

loadDataSet()
导入数据集,数据集包含多条list,每个list是一个项集
createC1(dataSet)
创建C1,提取出所有单个的项,这里用frozenset的原因是后面要用这个作为字典的key
scanD(D, Ck, minSupport)
过滤掉Ck中不符合最小支持度的,返回满足的Lk和最小支持度
apprioriGen(Lk, k)
将Lk合并得到Ck+1,这里通过只对前k-1个元素进行比较,可以减少遍历次数。比如合并{0,1},{0,2},{1,2}合并,只需要判断一次就行
apriori(dataSet, minsupport=0.5)
将上面的几个函数综合起来,完成整个过程。结束条件是不再能够产生新的项集
generateRules(L, supportData, minConf=0.7)
生成关联规则的主函数,这里要从包含两个项的频繁项集开始判断
calcConf(freqSet, H, supportData, brl, minConf=0.7)
对于给定的频繁项集freqSet和可以推断出来的H计算置信度,得到关联规则
rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7)
这里的不同是H可以变得更复杂,比如说现在有{1,2,3}-->{1}{2},这里我们希望将H进一步合并得到{1,2}从而更加充分的发掘关联规则。这是一个递归的过程知道无法再合并结束。

  1.  #coding=utf-8
    def loadDataSet():
    return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
    def creteC1(dataSet):
    C1 = []
    for transaction in dataSet:
    for item in transaction:
    if [item] not in C1:
    C1.append([item])
    C1.sort()
    return map(frozenset,C1)
    def scanD(D, Ck, minSupport):
    ssCnt = {}
    for tid in D:
    for can in Ck:
    if can.issubset(tid):
    if ssCnt.has_key(can):
    ssCnt[can] += 1
    else:
    ssCnt[can] = 1
    numItems = float(len(D))
    retList = []
    supportData = {}
    for key in ssCnt:
    supprt = ssCnt[key] / numItems
    if supprt >= minSupport:
    retList.append(key)
    supportData[key] = supprt
    return retList,supportData
    def appriGen(Lk,k):
    retList = []
    lenLk = len(Lk)
    for i in range(lenLk):
    for j in range(i+1, lenLk):
    L1 = list(Lk[i])[:k-2]#前k-1个
    L2 = list(Lk[i])[:k-2]
    L1.sort()
    L2.sort()
    if L1 == L2:
    retList.append(Lk[i] | Lk[j])
    return retList
    def apriori(dataSet, minSupport=0.5):
    C1 = creteC1(dataSet)
    D = map(set, dataSet)
    L1, supportData = scanD(D,C1,minSupport=0.7)
    L = [L1]
    k=2
    while len(L[k-2]) > 0:
    Ck = appriGen(L[k-2], k)
    Lk, supK = scanD(D, Ck, minSupport)
    supportData.update(supK)
    L.append(Lk)
    k += 1
    return L,supportData
    def generateRules(L, supportData, minConf=0.7):
    bigRules = []
    for i in range(1,len(L)):#从包含两个的开始
    for freqSet in L[i]:
    H1 = [frozenset([item]) for item in freqSet]
    if (i>1):#频繁项集元素数目大于2
    rulesFormConseq(freqSet,H1,supportData,bigRules,minConf)
    else:
    calcConf(freqSet,H1,supportData,bigRules,minConf)
    return bigRules
    def calcConf(freqSet, H, supportData,brl,minConf=0.7):
    prunedH = []
    for conseq in H:
    conf = supportData[freqSet] / supportData[freqSet - conseq]
    print supportData[freqSet] , supportData[freqSet - conseq]
    if conf >= minConf:
    print freqSet-conseq,'-->',conseq,'conf',conf
    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 = appriGen(H,m+1)
    Hmp1 = calcConf(freqSet,Hmp1,supportData,brl,minConf)
    if len(Hmp1)>1:
    rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)
    def main():
    dataSet = loadDataSet()
    L,supportData = apriori(dataSet, minSupport=0.7)
    print L
    rules = generateRules(L,supportData,minConf=0.7)
    print rules if __name__ == '__main__':
    main()
  2. 机器学习笔记索引

关联挖掘和Aprioir算法的更多相关文章

  1. WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...

  2. 关联分析:FP-Growth算法

    关联分析又称关联挖掘,就是在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品 ...

  3. 相似性度量 Aprioir算法

    第三章 标称:转换成0,1来算,或者用非对称二元属性 二元:x1,x2的分布取00,01,10,11的二元属性个数,列表,算比例.不对称的二元属性就忽略00的属性个数 序数:转换成排位rif,度量:r ...

  4. 关联规则挖掘之apriori算法

    前言: 众所周知,关联规则挖掘是数据挖掘中重要的一部分,如著名的啤酒和尿布的问题.今天要学习的是经典的关联规则挖掘算法--Apriori算法 一.算法的基本原理 由k项频繁集去导出k+1项频繁集. 二 ...

  5. Frequent Pattern 挖掘之一(Aprior算法)(转)

    数据挖掘中有一个很重要的应用,就是Frequent Pattern挖掘,翻译成中文就是频繁模式挖掘.这篇博客就想谈谈频繁模式挖掘相关的一些算法. 定义 何谓频繁模式挖掘呢?所谓频繁模式指的是在样本数据 ...

  6. NLP&数据挖掘基础知识

    Basis(基础): SSE(Sum of Squared Error, 平方误差和) SAE(Sum of Absolute Error, 绝对误差和) SRE(Sum of Relative Er ...

  7. 常见的机器学习&数据挖掘知识点

    原文:http://blog.csdn.net/heyongluoyao8/article/details/47840255 常见的机器学习&数据挖掘知识点 转载请说明出处 Basis(基础) ...

  8. 数据挖掘系列(1)关联规则挖掘基本概念与Aprior算法

    整理数据挖掘的基本概念和算法,包括关联规则挖掘.分类.聚类的常用算法,敬请期待.今天讲的是关联规则挖掘的最基本的知识. 关联规则挖掘在电商.零售.大气物理.生物医学已经有了广泛的应用,本篇文章将介绍一 ...

  9. 静态频繁子图挖掘算法用于动态网络——gSpan算法研究

    摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的 ...

随机推荐

  1. UIDynamic(捕捉行为)

    一.简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化 - (instancetype)initWithItem:(id <UID ...

  2. iOS音乐播放器相关

    iOS音乐播放器框架主要有两大类:AvPlayer.AvaudioPlayer AvPlayer 能播放本地及网络歌曲 AvaudioPlayer 能播放本地歌曲.有相关代理方法(其实也可以播放网络歌 ...

  3. TYVJ P1080 N皇后

    描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 列号  1  2  3  4  5  6 -- ...

  4. POJ3249:Test for Job

    传送门 很简单的一道题,被卡了几次,死于答案非法统计. 题意是求图里的一条最长的路径满足起点的入度和终点的出度都是0,而且图是DAG. 既然是DAG求最长路,DP即可.搞出拓扑序,逆序DP,然后统计所 ...

  5. javascript判断手机浏览器版本信息

    <script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser={ versions:functio ...

  6. 关于背景图相对父容器垂直居中问题 —— vertical-align 和 line-height 之间的区别

       html css <div class="register-wrapper"> <div class="register"> &l ...

  7. foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because 'System.Web.UI.WebControls.Table' does not contain a public definition for 'GetEnumerator'

    错误:foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because ' ...

  8. 【转载】Arcengine效率探究之二——属性的更新

    文转载自hymyjl2010<Arcengine效率探究之二——属性的更新>   修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...

  9. SQL Server遍历表的几种方法

    在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的 ...

  10. [UML]UML系列——用例图中的各种关系(include、extend)

    用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1)  概 ...