学号姓名第二次实验关联规则挖掘文档格式.docx
- 文档编号:17311477
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:12
- 大小:54.67KB
学号姓名第二次实验关联规则挖掘文档格式.docx
《学号姓名第二次实验关联规则挖掘文档格式.docx》由会员分享,可在线阅读,更多相关《学号姓名第二次实验关联规则挖掘文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
备注:
序号
(一)、
(二)、(三)为实验预习填写项
四、实验步骤及程序编辑:
#-*-coding:
utf-8-*-
"
SpyderEditor
Thisisatemporaryscriptfile.
defload_data_set():
"
Loadasampledataset(FromDataMining:
ConceptsandTechniques,3thEdition)
Returns:
Adataset:
Alistoftransactions.Eachtransactioncontainsseveralitems.
data_set=[['
l1'
'
l2'
l5'
],['
l4'
l3'
],
['
]]
returndata_set
defcreate_C1(data_set):
Createfrequentcandidate1-itemsetC1byscaningdataset.
Args:
data_set:
C1:
Asetwhichcontainsallfrequentcandidate1-itemsets
C1=set()
fortindata_set:
foritemint:
item_set=frozenset([item])
C1.add(item_set)
returnC1
defis_apriori(Ck_item,Lksub1):
Judgewhetherafrequentcandidatek-itemsetsatisfyAprioriproperty.
Ck_item:
afrequentcandidatek-itemsetinCkwhichcontainsallfrequent
candidatek-itemsets.
Lksub1:
Lk-1,asetwhichcontainsallfrequentcandidate(k-1)-itemsets.
True:
satisfyingAprioriproperty.
False:
NotsatisfyingAprioriproperty.
foriteminCk_item:
sub_Ck=Ck_item-frozenset([item])
ifsub_CknotinLksub1:
returnFalse
returnTrue
defcreate_Ck(Lksub1,k):
CreateCk,asetwhichcontainsallallfrequentcandidatek-itemsets
byLk-1'
sownconnectionoperation.
k:
theitemnumberofafrequentitemset.
Return:
Ck:
asetwhichcontainsallallfrequentcandidatek-itemsets.
Ck=set()
len_Lksub1=len(Lksub1)
list_Lksub1=list(Lksub1)
foriinrange(len_Lksub1):
forjinrange(1,len_Lksub1):
l1=list(list_Lksub1[i])
l2=list(list_Lksub1[j])
l1.sort()
l2.sort()
ifl1[0:
k-2]==l2[0:
k-2]:
Ck_item=list_Lksub1[i]|list_Lksub1[j]
#pruning
ifis_apriori(Ck_item,Lksub1):
Ck.add(Ck_item)
returnCk
defgenerate_Lk_by_Ck(data_set,Ck,min_support,support_data):
GenerateLkbyexecutingadeletepolicyfromCk.
Asetwhichcontainsallallfrequentcandidatek-itemsets.
min_support:
Theminimumsupport.
support_data:
Adictionary.Thekeyisfrequentitemsetandthevalueissupport.
Lk:
Asetwhichcontainsallallfrequentk-itemsets.
Lk=set()
item_count={}
foriteminCk:
ifitem.issubset(t):
ifitemnotinitem_count:
item_count[item]=1
else:
item_count[item]+=1
t_num=float(len(data_set))
foriteminitem_count:
if(item_count[item]/t_num)>
=min_support:
Lk.add(item)
support_data[item]=item_count[item]/t_num
returnLk
defgenerate_L(data_set,k,min_support):
Generateallfrequentitemsets.
Maximumnumberofitemsforallfrequentitemsets.
L:
ThelistofLk.
support_data={}
C1=create_C1(data_set)
L1=generate_Lk_by_Ck(data_set,C1,min_support,support_data)
Lksub1=L1.copy()
L=[]
L.append(Lksub1)
foriinrange(2,k+1):
Ci=create_Ck(Lksub1,i)
Li=generate_Lk_by_Ck(data_set,Ci,min_support,support_data)
Lksub1=Li.copy()
returnL,support_data
defgenerate_big_rules(L,support_data,min_conf):
Generatebigrulesfromfrequentitemsets.
min_conf:
Minimalconfidence.
big_rule_list:
Alistwhichcontainsallbigrules.Eachbigruleisrepresented
asa3-tuple.
big_rule_list=[]
sub_set_list=[]
foriinrange(0,len(L)):
forfreq_setinL[i]:
forsub_setinsub_set_list:
ifsub_set.issubset(freq_set):
conf=support_data[freq_set]/support_data[freq_set-sub_set]
big_rule=(freq_set-sub_set,sub_set,conf)
ifconf>
=min_confandbig_rulenotinbig_rule_list:
#printfreq_set-sub_set,"
=>
sub_set,"
conf:
conf
big_rule_list.append(big_rule)
sub_set_list.append(freq_set)
returnbig_rule_list
if__name__=="
__main__"
:
Test
data_set=load_data_set()
L,support_data=generate_L(data_set,k=3,min_support=0.2)
big_rules_list=generate_big_rules(L,support_data,min_conf=0.7)
forLkinL:
print("
="
*50)
frequent"
+str(len(list(Lk)[0]))+"
-itemsets\t\tsupport"
)
forfreq_setinLk:
print(freq_set,support_data[freq_set])
BigRules"
foriteminbig_rules_list:
print(item[0],"
=>
item[1],"
item[2])
#-*-coding:
from__future__importprint_function
importpandasaspd
d=pd.read_csv('
C:
//apriori.txt'
header=None,dtype=object)
print(u'
\n转换原始数据至0-1矩阵...'
importtime
start=time.clock()
ct=lambdax:
pd.Series(1,index=x)
b=map(ct,d.as_matrix())
d=pd.DataFrame(list(b)).fillna(0)
d=(d==1)
end=time.clock()
\n转换完毕,用时:
%0.2f秒'
%(end-start))
\n开始搜索关联规则...'
delb
support=0.06#最小支持度
confidence=0.75#最小置信度
ms='
--'
#连接符,用来区分不同元素,如A--B。
需要保证原始表格中不含有该字符
#自定义连接函数,用于实现L_{k-1}到C_k的连接
defconnect_string(x,ms):
x=list(map(lambdai:
sorted(i.split(ms)),x))
l=len(x[0])
r=[]
foriinrange(len(x)):
forjinrange(i,len(x)):
ifx[i][:
l-1]==x[j][:
l-1]andx[i][l-1]!
=x[j][l-1]:
r.append(x[i][:
l-1]+sorted([x[j][l-1],x[i][l-1]]))
returnr
#寻找关联规则的函数
deffind_rule(d,support,confidence):
importtime
start=time.clock()
result=pd.DataFrame(index=['
support'
confidence'
])#定义输出结果
support_series=1.0*d.sum()/len(d)#支持度序列
column=list(support_series[support_series>
support].index)#初步根据支持度筛选
k=0
whilelen(column)>
1:
k=k+1
print(u'
\n正在进行第%s次搜索...'
%k)
column=connect_string(column,ms)
数目:
%s...'
%len(column))
sf=lambdai:
d[i].prod(axis=1,numeric_only=True)#新一批支持度的计算函数
#创建连接数据,这一步耗时、耗内存最严重。
当数据集较大时,可以考虑并行运算优化。
d_2=pd.DataFrame(list(map(sf,column)),index=[ms.join(i)foriincolumn]).T
support_series_2=1.0*d_2[[ms.join(i)foriincolumn]].sum()/len(d)#计算连接后的支持度
column=list(support_series_2[support_series_2>
support].index)#新一轮支持度筛选
support_series=support_series.append(support_series_2)
column2=[]
foriincolumn:
#遍历可能的推理,如{A,B,C}究竟是A+B-->
C还是B+C-->
A还是C+A-->
B?
i=i.split(ms)
forjinrange(len(i)):
column2.append(i[:
j]+i[j+1:
]+i[j:
j+1])
cofidence_series=pd.Series(index=[ms.join(i)foriincolumn2])#定义置信度序列
foriincolumn2:
#计算置信度序列
cofidence_series[ms.join(i)]=support_series[ms.join(sorted(i))]/support_series[ms.join(i[:
len(i)-1])]
foriincofidence_series[cofidence_series>
confidence].index:
#置信度筛选
result[i]=0.0
result[i]['
]=cofidence_series[i]
]=support_series[ms.join(sorted(i.split(ms)))]
result=result.T.sort_values(['
'
],ascending=False)#结果整理,输出
end=time.clock()
\n搜索完成,用时:
\n结果为:
'
print(result)
returnresult
find_rule(d,support,confidence).to_excel('
//rules.xls'
五、程序调试及实验总结:
学习掌握了关联规则的算法
六、教师评语:
该生能按要求完成实验内容,实验报告版面美观,实验步骤完成得较好。
此次实验成绩为:
优秀。
成绩
主讲教师:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学号 姓名 第二次 实验 关联 规则 挖掘