关联分析-Apriori法python代码注解

自己的一点点领悟,可能会有点小错误,欢迎交流^_^

获得频繁项集

主要思想

python代码

def loadDataSet():
    return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]

createC1(dataSet)获得所有第一层的所有项集

def createC1(dataSet):
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])

    C1.sort()
    return map(frozenset,C1)
#scanD是根据训练数据D,来判断Ck里面一堆的项集是否是频繁的。

def scanD(D,Ck,minSupport):
    ssCnt = {}
    for tid in D:
        for can in Ck:
            if can.issubset(tid):
                if not ssCnt.has_key(can): ssCnt[can] = 1
                else: ssCnt[can] += 1
    numItems = float(len(D))
    retList = []
    supportData = {}
    for key in ssCnt:
        support = ssCnt[key] / numItems
        if support >= minSupport:
            retList.insert(0,key)
        supportData[key] = support
    return retList,supportData
#根据前一层的项集的合并得到下一层的。比如
#值得注意的是这样得到的下一层不一定就是频繁项集,还得进行k-2次的判断
{1,2} {3,4} {1,3} 就可以得到{1,2,3}
def aprioriGen(Lk,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 = map(set,dataSet)
    L1,supportData = scanD(D,C1,minSupport)
    L = [L1]
    k = 2
    while (len(L[k-2]) > 0):
        Ck = aprioriGen(L[k-2],k)
        Lk,supK=scanD(D,Ck,minSupport)
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L,supportData

根据频繁项集获得关联规则

主要思想

只看规则的右边发现就是之前获得频繁项集的方法哦

然后对于一个频繁项集定义的规则必须包含所有的元素,那么只要一个规则的右边确定了的话,规则的左边=频繁项集-右边的。下面就是用H规则右边的可能情况表示。

pythoh代码

//主函数. 初始状态 使得规则右边也就是H只有一个元素。
def generateRules(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
//计算规则的支持度是否符合要求。最后返回所有可能的 规则右边的集合prunedH. brl存放了所有满足要求的规则。
def calcConf(freqSet,H,supportData,brl,minConf=0.7):
    prunedH = []
    for conseq in H:
        conf = 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
//就像频繁项集一样,试图对规则的右边也就是H进行合并.然后产生新的规则
def  rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):
    m = len(H[0])
    if (len(freqSet) > (m+1)):
        Hmp1 = aprioriGen(H,m+1)
        Hmp1 = calcConf(freqSet,Hmp1,supportData,brl,minConf)
        if (len(Hmp1)>1):
            rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)

注意点

apriori

转自Henry

At each level kk, you have kk-item sets which are frequent (have sufficent support).

At the next level, the kk+11-item sets you need to consider must have the property that each of their subsets must be frequent (have sufficent support). This is the apriori property: any subset of frequent itemset must be frequent.

So if you know at level 2 that the sets {1,2}{1,2}, {1,3}{1,3}, {1,5}{1,5} and {3,5}{3,5} are the only sets with sufficient support, then at level 3 you join these with each other to produce {1,2,3}{1,2,3}, {1,2,5}{1,2,5}, {1,3,5}{1,3,5} and {2,3,5}{2,3,5} but you need only consider {1,3,5}{1,3,5} further: the others each have subsets with insufficent support (such as {2,3}{2,3} or {2,5}{2,5} ).

极大频繁集

包含他的都不是频繁集

闭频繁集

包含他的支持度计数都小于他

习题

1

2

(a) s({e}) = 0.8 s({b,d}) = 0.2 s({b,d,e}) = 0.2

3

(a) C(?→A)=S(A)

(b) c1>c2,c2<c3 -> c1>=c2,c2 <= c3

(c) 规则具有相同的置信度->支持度也就是left->right {left,rigth}的支持度一样

6

(a) 36?26?2+1=602

(b) 4

(c) 5+C(4,3)+1+C(4,3) -> C(6,3)

(d) 黄油,面包

7

(b) {1,2,3,4},{1,2,3,5},{1,2,4,5},{1,3,4,5},{2,3,4,5}

(c) {1,2,3,4},{1,2,3,5}, //无{1,4,5},无{2,4,5}

8

  1. 在画图的时候要注意,不仅仅是I的时候要向下画N,在是N的时候也也要向下画N。
  2. F/total
  3. I/total
时间: 2024-08-26 17:25:47

关联分析-Apriori法python代码注解的相关文章

数据挖掘-关联分析 Apriori算法和FP-growth 算法

?1.关联分析概念 关联分析是从大量数据中发现项集之间有趣的关联和相关联系. ? ?定义:1.事务:每一条交易称为一个事务,如上图包含5个事务.2.项:交易的每一个物品称为一个项,例如豆奶,啤酒等. 3.项集:包含零个或多个项的集合叫做项集,例如{尿布,啤酒}.4.k?项集:包含k个项的项集叫做k-项集,例如 {豆奶,橙汁}叫做2-项集.5.支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几.例如{尿布, 啤酒}出现在事务002.003和005中,所以           它的支持度计

机器学习算法-Apriori关联分析

引文: 学习一个算法,我们最关心的并不是算法本身,而是一个算法能够干什么,能应用到什么地方.很多的时候,我们都需要从大量数据中提取出有用的信息,从大规模数据中寻找物品间的隐含关系叫做关联分析(association analysis)或者关联规则学习(association rule learning).比如在平时的购物中,那些商品一起捆绑购买销量会比较好,又比如购物商城中的那些推荐信息,都是根据用户平时的搜索或者是购买情况来生成的.如果是蛮力搜索的话代价太高了,所以Apriori就出现了,就是

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

第十四篇:Apriori 关联分析算法原理分析与代码实现

前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文将讲解关联分析领域中最为经典的Apriori算法,并给出具体的代码实现. 关联分析领域的一些概念 1. 频繁项集: 数据集中经常出现在一起的物品的集合.例如 "啤酒和尿布" 2. 关联规则: 指两个物品集之间可能存在很强的关系.例如 "{啤酒} -> {尿布}"

Apriori 关联分析算法原理分析与代码实现

前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文将讲解关联分析领域中最为经典的Apriori算法,并给出具体的代码实现. 关联分析领域的一些概念 1. 频繁项集: 数据集中经常出现在一起的物品的集合.例如 "啤酒和尿布" 2. 关联规则: 指两个物品集之间可能存在很强的关系.例如 "{啤酒} -> {尿布}"

Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次呢,我们会在上次的基础上,讲讲如何分析物品的关联规则得出关联结果,以及给出用apyori这个库运行得出关联结果的代码. 一. 基础知识 上次我们介绍了几个关联分析的概念,支持度,置信度,提升度.这次我们重点回顾一下置信度和提升度: 置信度(Confidence):置信度是指如果购买物品A,有较大可能

使用Apriori进行关联分析(一)

大型超市有海量交易数据,我们可以通过聚类算法寻找购买相似物品的人群,从而为特定人群提供更具个性化的服务.但是对于超市来讲,更有价值的是如何找出商品的隐藏关联,从而打包促销,以增加营业收入.其中最经典的案例就是关于尿不湿和啤酒的故事.怎样在繁杂的数据中寻找到数据之间的隐藏关系?当然可以使用穷举法,但代价高昂,所以需要使用更加智能的方法在合理时间内找到答案.Apriori就是其中的一种关联分析算法. 基本概念 关联分析是一种在大规模数据集中寻找有趣关系的非监督学习算法.这些关系可以有两种形式:频繁项

使用Apriori进行关联分析(二)

书接上文(使用Apriori进行关联分析(一)),介绍如何挖掘关联规则. 发现关联规则 我们的目标是通过频繁项集挖掘到隐藏的关联规则,换句话说就是关联规则. 所谓关联规则,指通过某个元素集推导出另一个元素集.比如有一个频繁项集{底板,胶皮,胶水},那么一个可能的关联规则是{底板,胶皮}→{胶水},即如果客户购买了底板和胶皮,则该客户有较大概率购买胶水.这个频繁项集可以推导出6个关联规则: {底板,胶水}→{胶皮}, {底板,胶皮}→{胶水}, {胶皮,胶水}→{底板}, {底板}→{胶水, 胶皮

Python代码分析工具:PyChecker、Pylint

1 概述 PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告. PyChecker可以工作在多种方式之下.首先,PyChecker会导入所检查文件中包含的模块,检查导入是否正确,同时检查文件中的函数.类和方法等. PyChecker可以检查出来的问题有如下几种: 全局量没有找到,比如没有导入模块 传递给函数.方法.构造器的参数数目错误 传递给内建函数和方法的参数数目错误 字符串格式化信息不匹配 使用不存在的类方法和属