一个关联规则算法
```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) ```