Advertisement

挖掘频繁模式、关联和相关性:基本概念和方法

阅读量:

1.频繁模式的概念
频繁模式: 是频繁地出现在数据集中的模式(如项集、子序列或子结构),如果一个子结构频繁的出现,则称它为(频繁的)结构模式。
例子购物篮分析:用户购买电脑同时购买杀毒软件
关联规则:computer =>antivirus_software[support = 2%;confidence = 60%]
规则的支持度(support)置信度(condidence) 是规则兴趣度的两种度量。他们分别反映所发现规则的有用性和确定性。2%表示所有事务中同时购买两者占比,60%意味着购买电脑的用户60%也购买了杀毒软件。
支持度(support): 数据集中包含该项集的记录所占的比例。
support(A=>B) = P(A \bigcup B) = \frac{A,B同时发生的事件个数}{总事件个数}
可信度(condfidence): condfidence(A=>B) =P(B|A) = \frac{support(A\bigcup B)}{support(A)} = \frac{support\_ccount(A \bigcup B }{support\_count(A)}
2.关联分析。

  • 关联分析: 关联分析是一种规模数据集中寻找有趣业务,这些关系可以有两种形式。
  • 频繁项集: 经常出现在一块的物品集合。
  • 关联规则: 暗示两种物品之间可能存在很强的关系。
    3.Apriori算法简介
    Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。算法使用频繁项集性质的先验性质,即频繁项集的所有非空子集也一定是频繁的。Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记为L1。然后,使用L1找出频繁2项集的集合L2,使用L2找出L3,如此下去,直到不能再找到频繁k项集。每找出一个Lk需要一次数据库的完整扫描。Apriori算法使用频繁项集的先验性质来压缩搜索空间。
    4.下图是《数据挖掘:概念与技术》(第三版)中挖掘频繁项集的样例图解。
    Aprior算法中频繁项集的变化情况
    5.使用python实现Apriori算法
复制代码
    """
    #version :python3.7
     #author: 蛮小树
     #title: MyApriori算法
     #Date : 2020-3-27
     #reprint: https://zhuanlan.zhihu.com/p/39918644
    """
    '''创建一个用于数据测试的函数数据集'''
    def loadDataSet():
     return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
    # C1是大小为1的所有候选项的集合
    def createC1(dataSet):
    C1 = []
    for i in dataSet:
        for j in i:
            if not [j] in C1:
                C1.append([j]) #不重复的存储所有项
    C1.sort()   #对C1进行排序
    #map() 会根据提供的函数对指定序列做映射。
    # 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
    #frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
    return list(map(frozenset,C1))
    # C1:[frozenset({1}), frozenset({2}), frozenset({3}), frozenset({4}), frozenset({5})]
    #该函数用于从C1生成L1
    def scanD(D,Ck,minSupport):
    #c参数:数据集 ,候选数据集列表ck  感兴趣的最小支持度minsupport
    ssCnt = {}
    for tid in D: #遍历数据集
        for can in Ck: #遍历候选项
            #ssubset() 方法用于判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False。
            if can.issubset(tid): #判断候选项中是否包含数据集的各项
                if not can in ssCnt:
                    ssCnt[can] = 1 #不含设为1
                else: ssCnt[can] += 1 #有则计数加1
    numItems = float(len(D)) #数据集的大小
    retlist = [] #L1初始化
    supportData = {} #记录候选项中各个数据的支持度
    for key in ssCnt:
        support = ssCnt[key]/numItems#计算支持度
        if support >= minSupport:
            #L.insert(index,obj) index -- 对象obj需要插入的索引值,obj -- 要插入列表中的对象。
            retlist.insert(0,key) #满足条件加入L1中
        supportData[key] = support
    return retlist,supportData
    #l1的生成情况
    print(scanD(loadDataSet(),createC1(loadDataSet()),0.5))
    
    def aprioriGen(LK,K): #组合,向上合并
    # Ck参数:频繁项集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:#若两个集合的前K-2个项目同时,则将两个集合合并
                retList.append(LK[i] | LK[j])
    return retList
    #apriori
    def apriori(dataSet,minSupport = 0.5):
    C1 = createC1(dataSet)
    D = list(map(set,dataSet))
    L1,supportData = scanD(D,C1,minSupport) #单项最小支持度判断0.5,生成L1
    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
    print(apriori(loadDataSet(),0.5))
    
    output:([[frozenset({5}), frozenset({2}), frozenset({3}), frozenset({1})], [frozenset({2, 3}), frozenset({3, 5}), frozenset({2, 5}), frozenset({1, 3})], [frozenset({2, 3, 5})], []], {frozenset({1}): 0.5, frozenset({3}): 0.75, frozenset({4}): 0.25, frozenset({2}): 0.75, frozenset({5}): 0.75, frozenset({1, 3}): 0.5, frozenset({2, 5}): 0.75, frozenset({3, 5}): 0.5, frozenset({2, 3}): 0.5, frozenset({1, 5}): 0.25, frozenset({1, 2}): 0.25, frozenset({2, 3, 5}): 0.5})
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

全部评论 (0)

还没有任何评论哟~