Apriori算法关联分析与pyhon实现

算法中核心性质:频繁项集的所有非空子集也必须是频繁的。逆反命题 也成立:如果一个项集是非频繁的,那么所有它的超集也是非频繁。

一、Apriori算法简介:  Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。 Apriori(先验的,推测的)算法应用广泛,可用于消费市场价格分析,猜测顾客的消费习惯;网络安全领域中的入侵检测技术;可用在用于高校管理中,根据挖掘规则可以有效地辅助学校管理部门有针对性的开展贫困助学工作;也可用在移动通信领域中,指导运营商的业务运营和辅助业务提供商的决策制定。

二、挖掘步骤:

1.依据支持度找出所有频繁项集(频度)

2.依据置信度产生关联规则(强度)

三、基本概念

对于A->B

①支持度:P(A ∩ B),既有A又有B的概率

②置信度:

P(B|A),在A发生的事件中同时发生B的概率 p(AB)/P(A)     例如购物篮分析:牛奶 ⇒ 面包

例子:[支持度:3%,置信度:40%]

支持度3%:意味着3%顾客同时购买牛奶和面包

置信度40%:意味着购买牛奶的顾客40%也购买面包

③如果事件A中包含k个元素,那么称这个事件Ak项集事件A满足最小支持度阈值的事件称为频繁k项集。

④同时满足最小支持度阈值和最小置信度阈值的规则称为强规则

四、实现步骤

    Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法Apriori使用一种称作逐层搜索的迭代方法,“K-1项集”用于搜索“K项集”。

首先,找出频繁“1项集”的集合,该集合记作L1L1用于找频繁“2项集”的集合L2,而L2用于找L3。如此下去,直到不能找到“K项集”。找每个Lk都需要一次数据库扫描。

核心思想是:连接步和剪枝步。连接步是自连接,原则是保证前k-2项相同,并按照字典顺序连接。剪枝步,是使任一频繁项集的所有非空子集也必须是频繁的。反之,如果某

个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。

简单的讲,1发现频繁项集,过程为(1)扫描(2)计数(3)比较(4)产生频繁项集(5)连接、剪枝,产生候选项集   重复步骤(1~5)直到不能发现更大的频集

2产生关联规则,过程为:根据前面提到的置信度的定义,关联规则的产生如下:

1)对于每个频繁项集L,产生L的所有非空子集;

2)对于L的每个非空子集S,如果

                PL/PS)≧min_conf

注:L-S表示在项集L中除去S子集的项集


下面代码实现了一个简单数据集下的Apriori 算法实现:

def loadDataSet():
    return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
 
def createC1(dataSet):# return C1 frequent item set
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    return map(frozenset,C1) # frozenset can't changed !

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 # return result list and support data is a map

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
    
if __name__ == "__main__":
    '''
    dataSet = loadDataSet()
    print(dataSet)
    C1 = createC1(dataSet)
    print(C1)
    D = map(set, dataSet)
    print(D)
    L1,supportData = scanD(D, C1, 0.5)
    print(L1)
    print(supportData)
    '''
    dataSet = loadDataSet()
    L,supportData = apriori(dataSet)
    print(L[1])

结果输出:[[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])], [frozenset([1, 3]), frozenset([2, 5]), frozenset([2, 3]), frozenset([3, 5])], [frozenset([2, 3, 5])], []] 

从频繁项集中发现关联规则生成:

这里用到很重要的一个剪枝条件: 如 0,1,2 --> 3 是一条低可信度的规则,那么所有其他以3做为后件的规则可信度也会较低,这就是简单快速的剪枝规则。

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

def calcConf(freqSet,H,supportData,br1,minConf = 0.7):
    prunedH = []
    for conseq in H:
        conf = supportData[freqSet]/supportData[freqSet-conseq]
        if conf>= minConf:
            print freqSet-conseq,' --> ',conseq, 'confidence:',conf
            br1.append((freqSet-conseq,conseq,conf))
            prunedH.append(conseq)
    return prunedH

def rulesFromConseq(freqSet,H,supportData,br1,minConf = 0.7):
    m = len(H[0])
    if (len(freqSet)>(m+1)):
        Hmp1 = aprioriGen(H, m+1)
        Hmp1 = calcConf(freqSet, Hmp1, supportData, br1, minConf)
        if (len(Hmp1)>1):
            rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)

输出support 0.5 confidence 0.5 的关联规则:

frozenset([3])  -->  frozenset([1]) confidence: 0.666666666667
frozenset([1])  -->  frozenset([3]) confidence: 1.0
frozenset([5])  -->  frozenset([2]) confidence: 1.0
frozenset([2])  -->  frozenset([5]) confidence: 1.0
frozenset([3])  -->  frozenset([2]) confidence: 0.666666666667
frozenset([2])  -->  frozenset([3]) confidence: 0.666666666667
frozenset([5])  -->  frozenset([3]) confidence: 0.666666666667
frozenset([3])  -->  frozenset([5]) confidence: 0.666666666667
frozenset([5])  -->  frozenset([2, 3]) confidence: 0.666666666667
frozenset([3])  -->  frozenset([2, 5]) confidence: 0.666666666667
frozenset([2])  -->  frozenset([3, 5]) confidence: 0.666666666667


  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python可以通过使用第三方库来调用Apriori算法进行关联分析。其中比较常用的是mlxtend库中的apriori函数。使用该函数需要先将数据集转换成适合Apriori算法的格式,然后设置最小支持度和最小置信度等参数,最后调用apriori函数即可得到关联规则。具体操作可以参考以下代码: ```python from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules import pandas as pd # 读取数据集 data = pd.read_csv('data.csv') # 将数据集转换成适合Apriori算法的格式 data = pd.get_dummies(data) # 使用Apriori算法得到频繁项集 frequent_itemsets = apriori(data, min_support=.1, use_colnames=True) # 根据频繁项集得到关联规则 rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=.7) # 输出关联规则 print(rules) ``` 其中,min_support表示最小支持度,use_colnames表示使用列名而不是列索引,metric表示评估关联规则的指标,min_threshold表示最小置信度。 ### 回答2: Apriori算法是一种经典的关联分析算法,它通过挖掘数据集中的频繁项集来发现事务之间的关联规则。Python是一种流行的编程语言,它提供了丰富的数据分析工具和库,使得Python在数据挖掘和机器学习领域得到了广泛的应用。 Python中有多个库可以用来实现Apriori算法关联分析,其中最流行的是mlxtend库。Mlxtend库提供了多种关联分析算法实现,其中就包括了Apriori算法。 在Python中调用Apriori算法实现关联分析的步骤如下: 1. 安装mlxtend库:可以使用pip命令安装mlxtend库,命令为pip install mlxtend。 2. 导入mlxtend库:在Python代码中导入mlxtend库,命令为import mlxtend。 3. 准备数据集:将要进行关联分析的数据集导入 Python,并将其转换成一个二维矩阵的形式,每个列代表一个项目,每个行代表一次交易记录,矩阵中的元素表示该交易记录中是否购买了该项目。 4. 设置Apriori算法的参数:设置最小支持度(min_support)和最小置信度(min_confidence)参数,以达到所需的关联分析效果。 5. 使用Apriori算法:在Python中调用 Apriori函数,输入算法参数以及数据集,算法会遍历所有可能的频繁项集,并返回所有满足要求的频繁项集和关联规则。 6. 输出结果:将输出的频繁项集和关联规则作为字典、数据帧或其他数据结构保存下来,以方便后续的数据分析。 总体而言,使用Python调用Apriori算法进行关联分析是一个相对简单的操作,但要得到良好的关联规则,则需要对数据进行适当的预处理和调参,以充分发掘数据集中的信息和规律。 ### 回答3: Python是一种功能强大的编程语言,具有广泛的应用领域和强大的第三方库支持。其中,apriori算法是关联规则挖掘中的一种经典算法。它可以用于挖掘数据中的关联规则,探索数据之间的关联关系。这种算法在市场营销、交叉销售、推荐系统、安全监控等领域都有广泛应用。 Python中,我们可以使用已有的关联分析库来调用apriori算法,例如:mlxtend库。首先,我们需要安装该库。在命令行中输入 pip install mlxtend 即可完成安装。然后,我们可以使用以下代码进行关联分析: ``` import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules # 导入数据 data = pd.read_csv('data.csv', header=None) # 对数据进行one-hot编码 data = pd.get_dummies(data) # 使用apriori算法获取频繁项集 frequent_itemsets = apriori(data, min_support=0.1, use_colnames=True) # 根据频繁项集生成关联规则 rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7) # 输出结果 print(rules) ``` 在这段代码中,我们首先导入数据,并使用pd.get_dummies()方法对数据进行one-hot编码。然后,我们使用apriori()方法获取频繁项集,指定最小支持度为0.1。接着,我们使用association_rules()方法将频繁项集转换成强关联规则,指定最小置信度为0.7,并将结果打印出来。 需要注意的是,使用apriori算法时,需要指定最小支持度和最小置信度等参数,并且数据集应该是由离散型数据构成的。另外,关联分析算法容易出现算法稀疏性问题,需要对原始数据进行处理,选择合适的阈值来保证结果的可行性。 总之,Python的强大功能和第三方库支持,为调用apriori算法进行关联分析提供了良好的基础。在实际应用中,需要结合具体问题,对算法参数和数据进行适当调整,以达到最佳的分析效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值