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日

悬赏问题

  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题
  • ¥15 python点云生成mesh精度不够怎么办