美文网首页
关联分析

关联分析

作者: _Megamind_ | 来源:发表于2017-11-29 17:16 被阅读0次

    1)支持度计算

    a) 项集: 包含0个或者多个项(特征) 的集合被称为项集。如果一个项集包含k个项则称为k-项集。例如, {啤酒,尿布,牛奶} 是一个 3-项集

    b) 事务: 可以理解为一个样本

    c) 支持度计数: 在所有事务中该项集出现的次数。例如,{啤酒,尿布,牛奶} 的支持度为 2

    • 支持度用于确定给定数据集的频繁程度 [ 支持度计数 / 事务总数 ]

      (考虑规则{牛奶,尿布}->{啤酒}){牛奶,尿布,啤酒}的支持度为 **2/5=0.4 ** (其中 5 为 事务总数 )

    • 置信度确定 在考虑规则X->Y,Y在包含X的事务中出现的频繁程度

      (考虑规则{牛奶,尿布}->{啤酒}){牛奶,尿布}的支持度计数为 3 ,则该规则的置信度为 2/3

    image
    1. Aprori 算法
    • 原理(先验原理): 如果一个项集是频繁的,那么它的子集一定也是频繁的;相反,如果项集{a}是非频繁的,那么它的所有超集也一定是非频繁的。

    • 思路:

      • 初始化所有的1-项集,计算其支持度技术,过滤支持度计数小于阈值的项
      • 构建所有满足支持度计数阈值的 k-项集
      • 根据 目标项 依次遍历整个k-项集网络( 从网络的底部,即最大k-项集,开始 ),找到包含目标项的k-项集{related_items,target_item} 及 关联项的k-1项集{related_items},计算规则{related_items}->{target_item}的 置信度 ,过滤小于置信度阈值的规则
    • 实现:

      • 数据结构:

        • 项集网络:

          Fks = [fk_1,fk_2,] = [[[(a1,),w1]],[[(a1,a2,),w2],],]

        • k-项集:

          Fk = [[(a1,...,an),w],]

          • 说明

            fk的每个元素由一个 tuple类型的项集 和其对应的 支持度计数 构成

        • 说明:为了防止重复构建相同的项集,如由{1,2}和{2,3}构建的项集 以及 由{1,2}和{1,3}构建的项集,对每个k-1项集的集合做字典排序( 依据字母顺序或者数字顺序 )

      • k-项集的构建

      def apriori_gen(Fk,N):  # Fk为k-1项集的集合,N为总项数
        # k-1项集的总数
        lenFk = len(Fk)
        # k-1
        lenfk = len(Fk[0][0])
        # 每个k-1项集对应的k项集的最大数量
        step = N - lenfk
      
        ind = 0
        new_Fk = []
        for _fk,_w in Fk:
            for _i in range(ind,ind+step):
                # 输入的k-1项集是剪枝后的项集,项集总数会小于N和k-1的组合数
                if _i > lenFk - 1:
                    break
                if Fk[_i][0] == _fk:
                    continue
                # 取出前k-2项相同的k-1项集合并成k项集
                if Fk[_i][0][:lenfk-1] != _fk[:lenfk-1]:
                    break
                new_fk = tuple(sorted(set(_fk).union(Fk[_i][0])))
                new_Fk.append([new_fk,-1])
            ind += 1
        return new_Fk
      
      • k项集的剪枝
      def Fk_optimize(Fk,minsup):
        Fk_new = deepcopy(Fk)
        for fk in Fk:
            if fk[1] < minsup:
                Fk_new.remove(fk)
        return Fk_new
      
      • 匹配包含目标项的k项集及对应的k-1项集
       def find_fk_target(Fk, deepth, target):
        if type(target) == str:
            for _fk, _w in Fk[deepth]:
                if target in _fk:
                    return _fk, _w
            return None, None
        elif type(target) == tuple:
            for _fk, _w in Fk[deepth]:
                if _fk == target:
                    return _w
        else:
            assert False, 'please check the type of target which must be str or tuple'
      
      • apriori算法
      def apriori(data,targets):
        # 支持度计数阈值
        minsup = 20
        # 项总数(特征总数)
        N = data.shape[1]
        # 置信度阈值
        minconf = 0.3
      
        Fk = []
        # 初始化1-项集 & 剪枝
        Fk_1 = [[(_col,), len(data[data.loc[:,_col]==1])] for _col in sorted(data.columns)]
        Fk_1 = Fk_optimize(Fk_1, minsup)
        fks_1 = [_fk[0] for _fk, _w in Fk_1]
      
        # 频繁项集网络的构建(遍历)
        fk = Fk_1
        while len(fk) > 0:
            Fk.append(fk)
            fk = apriori_gen(fk,N)
            # 在数据集中找出对应特征均为1的行的总数作为支持度计数
            fk = [[_fk,data[data.loc[:, list(_fk)].sum(1) == len(_fk)].shape[0]]
                for _fk, _w in fk]
            fk = Fk_optimize(fk, minsup)
      
        # 规则的构建
        Rules = []
        for _target in targets:
            # 如果目标项不在初始的1-项集中
            if _target not in fks_1:
                continue
            # 从Fk项集网络的底部开始倒序遍历
            for deepth in reversed(range(1,len(Fk))):
                target_fk, target_w = find_fk_target(Fk, deepth, _target)
                if target_fk != None:
                    # 抽取规则前件(关联项集{related_items})
                    _fk = list(target_fk)
                    _fk.remove(_target)
                    _fk = tuple(_fk)
                    # 计算规则的置信度
                    target_conf = target_w / find_fk_target(Fk,deepth-1, _fk)
                    if target_conf > minconf:
                        Rules.append([_target, _fk, target_conf])
      
        return Rules
      

    相关文章

      网友评论

          本文标题:关联分析

          本文链接:https://www.haomeiwen.com/subject/fvlpbxtx.html