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. iOS多线程学习

    在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些 ...

  2. [uva11722&&cogs1488]和朋友会面Joining with Friend

    几何概型,<训练指南>的题.分类讨论太神啦我不会,我只会萌萌哒的simpson强上~这里用正方形在y=x-w的左上方的面积减去在y=x+w左上方的面积就是两条直线之间的面积,然后切出来的每 ...

  3. Unity 难点目录

    1.mesh的任意切割.(难点) 2.扇形区域识别玩家.(解决) 3.NGUI横滑同时竖滑,或滑动同时点击冲突处理.(解决)

  4. 如何用java自带的工具生成证书

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  5. safari浏览器在window下 打开控制台

    有时候需要在window下测试safari浏览器的兼容性 然后需要打开错误控制台 以下是完整打开的图文教程 1.显示菜单栏 2.打开偏好设置 3.然后切换到高级标签 勾选 在菜单栏显示开发菜单 4.打 ...

  6. URL Schemes

    APP 被唤醒离不开对URL Schemes的认知. 苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了 URL Schemes 这个解决办法. URL Schemes ...

  7. Discuzx系统 CSS 编码规范,CSS属性书写顺序

    1. 属性写在一行内,属性之间.属性名和值之间以及属性与“{}”之间须有空格,例如:.class { width: 400px; height: 300px; }     2. 属性的书写顺序:    ...

  8. UVA2639

    #include<iostream> using namespace std; int num[105]; int ans[105]; void init() { int temp=2; ...

  9. Java 内部类

    1.成员内部类 成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的.同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取. 2.局部内部类 ...

  10. win7 去快捷箭头

    去掉快捷方式箭头.reg   Windows Registry Editor Version 5.00   [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows ...