apriori 算法(py)

简介:
代码:
#  -*- coding: UTF8 -*-

import  sys
#  最小 支持度
sup_min  =  int(sys.argv[ 1 ])

ss 
=   " , "


#  交易 数据 库
D = [
 
' A,B,C,D ' ,
 
' B,C,E ' ,
 
' A,B,C,E ' ,
 
' B,D,E ' ,
 
' A,B,C,D '
]

print   " 交易数据库展现 "  
for  arr  in  D :  print  arr
print



'''
rows = int(sys.argv[ 1 ])
D=[]
for tid in open('BuyMusic.20090722.mob.prodIds').readlines()[:rows] :
    D.append(tid.split("\n")[0].split("\t")[1])


print "读取 文件结束 BuyMusic.20090722.mob.prodIds !"
'''
# 全局 频繁项 收集
sup_data_map  =  {}
# 全局  最大频繁项 收集
is_zsup = {}

#  遍历过程 临时 局部  频繁项 收集
mapL  =  {}

#  第一次 频繁项 收集
def  find_frequent_1_itemset(I):
    
if  I == ' null '   or  I == ''  :  return   
    
if  mapL.has_key(I): mapL[I] += 1  
    
else : mapL[I] = 1

map(find_frequent_1_itemset,[ I  
for  TID  in  D  for  I   in  TID.split(ss) ])

#  刷选掉 小于 最小支持度 的 频繁项
def  remove_not_sup_min(map,supmin = sup_min):
    
for  k   in  [k  for  k,v  in  map.items()  if  v < supmin] :
        
del  map[k]
remove_not_sup_min(mapL)

print   " 第一次 筛选 频繁项 结束! "
print  mapL

#  装载 全局 频繁项 最大频繁项
for  k,v  in  mapL.items() : 
    sup_data_map[k]
= v
    is_zsup[k]
= v

#  判定 是否 'BD' 属于  'BCD' 中 
isInTid  =   lambda  I,TID : len(I.split(ss))  ==  len([i  for  i  in  I  if  i  in  TID.split(ss)])


#  组合  [A,B] + [A,C] = [A,B.C]
def  comb(arr1,arr2):
    tmap
= {}
    
for  v  in  arr1 + arr2 : tmap[v] = ""  
    
return  tmap.keys()

#  apriori 迭代核心
def  runL(mapL,dep):
    mapL2 
=  {}
    C
= {}
    keys 
=  mapL.keys()
    iik
= ""
    jjk
= ""
    
#  根据 上次  频繁项 ,生成本次 '可能频繁项' 集合 
     for  ii  in  range(len(keys)) : 
        
for  jj  in  range(ii + 1 ,len(keys)) :
            keystr
= comb([ch  for  ch  in  keys[ii].split(ss)],[ch  for  ch  in  keys[jj].split(ss)])
            
if   not  len(keystr)  ==  dep :  continue
            keystr.sort()
            tk
= ss.join(keystr)
            
if   not  tk  in  C : C[tk] = (keys[ii],keys[jj])

    
#   '可能频繁项' 对比 交易数据库  计数
     for  tk,z  in  C.items():
        
for  TID  in  D:
            
if  isInTid(tk,TID) :
                
if  mapL2.has_key(tk): mapL2[tk] += 1
                
else : mapL2[tk] = 1

    
#  刷选掉 小于 最小支持度 的 频繁项
    remove_not_sup_min(mapL2)
    
for  k,v  in   is_zsup.items() :
        
for  k1,v1  in  mapL2.items() :
            
if  isInTid(k,k1) :
                
del  is_zsup[k]
                
break
    
#  全局 频繁项 ,最大频繁项  收集 
     for  k,v  in  mapL2.items() : 
        sup_data_map[k]
= v
        is_zsup[k]
= v
    
print   " " + str(dep) + " 次 筛选 频繁项 结束! "  
    
return  mapL2

#  真正 运行 
ii = 1
while  mapL :
    ii
= ii + 1
    mapL 
=  runL(mapL,ii)
    
print  mapL

#  全局  频繁项 中 去除 最大频繁项
for  k,v  in  is_zsup.items() :
    
if  sup_data_map.has_key(k) :  del  sup_data_map[k]

print   " 频繁项 "
print  sup_data_map
print  
print   " 最大频繁项 "
print  is_zsup
print  

print   " 可信度 展现 "
for  k,v  in   sup_data_map.items() :
    
for  k1,v1  in  is_zsup.items() :
        
if  isInTid(k,k1) :
            
print  k, " -> " ,k1, " \t%.1f "   % ((float(is_zsup[k1]) / float(sup_data_map[k])) * 100 ) + " % "
结果:
-bash-3.00$ python ap.py 2
交易数据库展现
A,B,C,D
B,C,E
A,B,C,E
B,D,E
A,B,C,D
第一次 筛选 频繁项 结束!
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3}
第2次 筛选 频繁项 结束!
{'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'B,E': 3, 'B,D': 3, 'B,C': 4}
第3次 筛选 频繁项 结束!
{'A,B,D': 2, 'A,B,C': 3, 'B,C,D': 2, 'B,C,E': 2, 'A,C,D': 2}
第4次 筛选 频繁项 结束!
{'A,B,C,D': 2}
第5次 筛选 频繁项 结束!
{}
频繁项
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3, 'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'A,B,D': 2, 'B,C,D': 2, 'A,C,D': 2, 'B,E': 3, 'B,D': 3, 'B,C': 4, 'A,B,C': 3}
最大频繁项
{'B,C,E': 2, 'A,B,C,D': 2}
可信度 展现
A -> A,B,C,D     66.7%
C -> B,C,E     50.0%
C -> A,B,C,D     50.0%
B -> B,C,E     40.0%
B -> A,B,C,D     40.0%
E -> B,C,E     66.7%
D -> A,B,C,D     66.7%
C,D -> A,B,C,D     100.0%
C,E -> B,C,E     100.0%
A,D -> A,B,C,D     100.0%
A,B -> A,B,C,D     66.7%
A,C -> A,B,C,D     66.7%
A,B,D -> A,B,C,D     100.0%
B,C,D -> A,B,C,D     100.0%
A,C,D -> A,B,C,D     100.0%
B,E -> B,C,E     66.7%
B,D -> A,B,C,D     66.7%
B,C -> B,C,E     50.0%
B,C -> A,B,C,D     50.0%

A,B,C -> A,B,C,D     66.7%

本文转自博客园刘凯毅的博客,原文链接:apriori 算法(py),如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
监控 算法 安全
Apriori算法:文档管理软件中的智能标签建议
Apriori算法是一种关联规则挖掘算法,它可以用于在大规模数据集中查找项集之间的频繁性关联。该算法的核心思想是通过迭代计算事物间的相对支持度,并根据预设的阈值来剪枝,以得到频繁的关联项。Apriori算法的优势在于可以快速地找到大量且未知的关联规则,广泛应用于数据挖掘领域。
117 1
|
1月前
|
算法
关联规则分析(Apriori算法2
关联规则分析(Apriori算法2
34 0
|
3月前
|
算法
关联规则分析(Apriori算法2
关联规则分析(Apriori算法2
30 0
|
4月前
|
算法 数据挖掘 数据库
【数据挖掘】频繁项集挖掘方法中Apriori、FP-Growth算法详解(图文解释 超详细)
【数据挖掘】频繁项集挖掘方法中Apriori、FP-Growth算法详解(图文解释 超详细)
137 0
|
6月前
|
机器学习/深度学习 算法 搜索推荐
关联规则挖掘:Apriori算法的深度探讨
关联规则挖掘:Apriori算法的深度探讨
318 0
|
3月前
|
算法 Python
通过案例理解Apriori算法
通过案例理解Apriori算法
27 1
|
3月前
|
算法 数据挖掘
关联规则分析(Apriori算法
关联规则分析(Apriori算法
37 0
|
4月前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
【数据挖掘】关联模式评估方法及Apriori算法超市购物应用实战(超详细 附源码)
49 0
|
7月前
|
机器学习/深度学习 存储 算法
机器学习关联分析PF和Apriori算法
机器学习关联分析PF和Apriori算法
58 0
|
8月前
|
运维 算法 搜索推荐
转:在网络行为管理软件中apriori算法的优势有哪些
在神奇的网络行为管理软件的世界里,Apriori算法变成了一位颇具优势的大咖。它主攻关联规则挖掘,以其卓越的表现协助于对数据集内各项之间的关联关系进行深入分析,帮你一层层揭开数据集的神秘面纱,看看各个项是怎么串起来的。
62 0