关联规则算法

一个关联规则算法

```javascript
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


'''定义一个数据'''
D=[['A','B','C','D'],['B','C','E'],['A','B','C','E'],['B','D','E'],['A','B','C','E'],['A','B','C','D']]
# E=[x.split(',')for x in D]
F=apriori(D,0.55)
print("预测结果为:")
for G in F:
    print(' '.join(G))
print('\n 预测的结果为: \n',F)
```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值