m0_59649455 2023-02-15 16:34 采纳率: 80%
浏览 14
已结题

谁能讲讲这个关联规则算法


def apriori(D,minsup):
#频繁项集用Keys表示
#Key表示项集中的某一项
#cutkeys表示经过剪枝的某个项集
#c表示k项集的每一项在事物数据库中D的支持度计数

#先求出1项的集合以及其相关计数
    c1={}
    for T in D:
        for i in T:
            if i in c1:
                c1[i]+=1
            else:
                c1[i]=1
    #print(c1)
    _keys1=c1.keys()
    keys1=[]
    for i in _keys1:
        keys1.append([i])
    n=len(D)
    cutKeys1=[]
    for k in keys1[:]:
        if c1[k[0]]*1.0/n >= minsup:
            cutKeys1.append(k)
    cutKeys1.sort()
    keys=cutKeys1

    all_keys=[]
    while keys !=[]:
        c=getc(D,keys)
        cutKeys=getCutKeys(keys,c,minsup,len(D))
        for key in cutKeys:
            all_keys.append(key)
        keys=apriori_gen(cutKeys)
    return all_keys

def getc(D,keys):
    '''对keys中的每一个key进行计数'''
    c=[]
    for key in keys:
        c_num=0
        for T in D:
            have=True
            for k in key:
                if k not in T:
                    have=False
            if have:
                c_num+=1
        c.append(c_num)
    return c
def getCutKeys(keys,c,minsup,length):
    for i,key in enumerate(keys):
        if float(c[i])/length < minsup:
            keys.remove(key)
    return keys

def KeyInt(key,T):
    '''判断某项key是否在数据库的某一个项目T中'''
    for k in key:
        if k not in T:
            return False
    return True

def apriori_gen(keys1):
    '''连接步骤'''
    keys2=[]
    for k1 in keys1:
        for k2 in keys1:
            if k1!=k2:
                key=[]
                for k in k1:
                    if k not in key:
                        key.append(k)
                for k in k2:
                    if k not in key:
                        key.append(k)
                key.sort()
                if key not in keys2:
                    keys2.append(key)
    return keys2
  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-02-15 16:42
    关注

    该回答引用ChatGPT
    这是一个 Python 语言实现的 Apriori 算法,用于在给定的事务数据库 D 中,挖掘频繁项集。Apriori 算法是一种经典的数据挖掘算法,它是一种迭代算法,通过利用频繁项集的性质,一步步挖掘出更高阶的频繁项集。

    代码中定义了一个名为 "apriori" 的函数,它接收两个参数:D 和 minsup,其中 D 是一个包含事务的列表,每个事务是一个包含多个项的列表,minsup 是指定的最小支持度阈值。函数返回频繁项集的列表 all_keys。

    代码中实现了 Apriori 算法的三个步骤

    第一步:找出单个项的支持度计数
    在这一步中,算法首先对所有事务中出现的每个项进行计数,即统计每个项在所有事务中出现的次数。计数结果存储在字典 c1 中,其中字典的键是项,值是该项在事务数据库中的支持度计数。随后,算法将 c1 中的所有项转换为一个项集 keys1,其中每个项都是一个单个项。然后,算法通过剪枝操作,过滤掉支持度计数小于 minsup 的项,得到剪枝后的项集 cutKeys1,并将其添加到最终的频繁项集列表 all_keys 中。

    第二步:迭代过程
    在第二步中,算法对剩余的项集进行迭代操作,直到所有的频繁项集都被找到为止。迭代过程中,算法先通过 getc 函数计算出当前项集中每个项的支持度计数,并将结果保存在列表 c 中。然后,算法通过剪枝操作,过滤掉支持度计数小于 minsup 的项集,得到剪枝后的项集 cutKeys,并将其添加到最终的频繁项集列表 all_keys 中。最后,算法通过 apriori_gen 函数生成下一阶段的候选项集。

    第三步:连接操作
    在第三步中,算法通过 apriori_gen 函数生成下一阶段的候选项集。该函数接收一个项集 keys1,并生成由两个项集连接而成的项集。具体来说,对于 keys1 中的每个项集 k1,函数都将其与其他项集连接起来,生成新的项集 k2。连接的规则是:对于 k1 和 k2 中的每个项,如果这个项在 k1 中或者在 k2 中出现过,则将其添加到新的项集中。最后,函数通过去重和排序操作,得到新的项集列表 keys2,并返回。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 已采纳回答 2月21日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么