prefixspan算法java实现.docx
- 文档编号:4380749
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:19.88KB
prefixspan算法java实现.docx
《prefixspan算法java实现.docx》由会员分享,可在线阅读,更多相关《prefixspan算法java实现.docx(15页珍藏版)》请在冰豆网上搜索。
prefixspan算法java实现
java实现prefixspan算法,吼吼。
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.LinkedHashMap;
importjava.util.List;
importjava.util.Map;
importjava.util.Map.Entry;
importjava.util.Set;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
/**
*
*功能描述:
pefixspan序列模式挖掘算法,输入:
序列集合,输出:
最大频繁序列
*@created2012-01-28下午2:
42:
54
*@version1.0.0
*@date2012-01-28下午2:
42:
54
*/
publicclassPrefixSpanBuild{
privatestaticLoggerlog=LoggerFactory.getLogger(PrefixSpanBuild.class);
/**
*序列集合
*/
privateList>>sequences=null;
/**
*最大频繁序列
*/
privateList>maxFrSeqs=newArrayList
>();
/**
*单项集合
*/
privateList
/**
*单项序列总和数
*/
privateinttotal=0;
/**
*最小支持数(默认两个)
*/
privateintminSup=0;
/**
*最小限制频繁序列元素数(默认两个)
*/
privateintminFrElemSize=0;
/**
*最大限制频繁序列元素数(默认3个)
*/
privateintmaxFrElemSize=0;
publicPrefixSpanBuild(List>>seqs){
this(seqs,2,2,3);
}
publicPrefixSpanBuild(List>>seqs,intminSup){
this(seqs,minSup,2,3);
}
publicPrefixSpanBuild(List>>seqs,intminSup,intminFrElemSize){
this(seqs,minSup,minFrElemSize,3);
}
publicPrefixSpanBuild(List>>seqs,intminSup,intminFrElemSize,
intmaxFrElemSize){
//最小项集必须小于或等于限制项集数
if(minFrElemSize<=maxFrElemSize){
this.sequences=seqs;
this.minSup=minSup;
this.minFrElemSize=minFrElemSize;
this.maxFrElemSize=maxFrElemSize;
for(List>elem:
this.sequences){
for(List
elem){
for(Stringitem:
items){
if(!
itemList.contains(item)){
itemList.add(item);
total++;
}
}
}
}
}
}
/**
*
*功能描述:
计算每个单项的支持数
*@return每个单项的支持数
*/
protectedMap
log.info("开始读取每个单项的支持数");
Map
//sup计算每个单项出现的次数(支持数)
Integersup=0;
Set
for(List>elem:
sequences){
for(List
elem){
itemsSet=newHashSet
itemsSet.addAll(items);
for(Stringitem:
itemsSet){
if(itemList.contains(item)){
if(supMap.containsKey(item)){
sup=supMap.get(item)+1;
}else{
sup=1;
}
supMap.put(item,sup);
}
}
}
}
for(Iterator
Entry
sup=supEntry.getValue();
if(sup iter.remove(); } } total=supMap.size(); log.info("读取完毕"); returnsupMap; } publicList List inti=strList.size(); intlength=prefixSeq.length; intpla=strList.indexOf(prefixSeq[length-1]); if(pla>=0&&pla retainList=newArrayList if(length==1){ retainList.add("_"); }else{ for(intk=0;k<=pla;k++){ retainList.add("_"); } } retainList.addAll(strList.subList(pla+1,i)); } returnretainList; } /** * *功能描述: temp_s在其投影数据库中查找再次出现他的次数 *@paramt_num序列总数 *@paramtemps序列 *@paramsd[]投影数据库 *@paramsd_count[]对应的索引 *@returnint */ publicintmakeout(Stringtemps,List returnmakeout(newString[]{temps},sdSeqs); } /** * *功能描述: temp_s在其投影数据库中查找再次出现他的次数 *@paramtempSeq序列 *@paramsdSeqs投影数据库 */ publicintmakeout(String[]tempSeq,List String[]tempsSeqClone=tempSeq.clone(); inttMincout=0; for(List sdSeqs){ for(List sdElem){ intn=-1; n=containArrays(sdItems,tempsSeqClone); if(n>=0){ tMincout++; break; } } } returntMincout; } /** * *功能描述: 用PrefixSpan算法求出序列集的频繁序列 */ protectedvoidprefixSpan(String[]prefixSeq,List //如果前缀得出的子序列的长度大于maxFrElemSize,则直接跳出 if(prefixNum>this.maxFrElemSize-1){ return; } for(inttTotal=0;tTotal //第一种情况a的投影数据库seqs,循环整个单项集合ItemList,看是否存在某个item在seqs上还存在频繁单项eg: intsupNum1=0; StringtempSeq=itemList.get(tTotal); supNum1=makeout(tempSeq,seqs); if(supNum1>=minSup){ //开始记录频繁序列 List if(prefixNum>=this.minFrElemSize-1){ for(inti=0;i itemList.add(prefixSeq[i]); } itemList.add(tempSeq); //添加支持数 itemList.add(supNum1+""); //添加置信度 itemList.add((float)supNum1/seqs.size()+""); maxFrSeqs.add(itemList); } List StringprefixSeq2[]=newString[prefixNum+1]; for(inte=0;e prefixSeq2[e]=prefixSeq[e]; prefixSeq2[prefixNum]=tempSeq; prefixSpan(prefixSeq2,sdSeqs,prefixNum+1); } //第二种情况a和ItemList的某个单项进行组合,看是否在seqs是还存在大于最小支持数的itemeg: intsupNum2=0; StringtempSeq1=prefixSeq[prefixNum-1]+","+itemList.get(tTotal); StringtempSeq1s[]=tempSeq1.split(","); supNum2=makeout(tempSeq1s,seqs); if(supNum2>=minSup){ //开始记录频繁序列 List if(prefixNum>=this.minFrElemSize){ for(inti=0;i itemList.add(prefixSeq[i]); } itemList.add(tempSeq1); //添加支持数 itemList.add(supNum2+""); //添加置信度 itemList.add((float)supNum2/seqs.size()+""); maxFrSeqs.add(itemList); } List Stringaa[]=newString[prefixNum]; for(inte=0;e aa[e]=prefixSeq[e]; aa[prefixNum-1]=tempSeq1; prefixSpan(aa,sdSeqs,prefixNum); } } } publicList Map inttimes=0; log.info("符合支持度为{},项集数为{}的总item数为{}",newInteger[]{minSup,minFrElemSize,total}); StringitemId=null; for(Entry supMap.entrySet()){ itemId=supEntry.getKey(); //生成投影数据库 List StringprefixSeq[]={itemId}; this.prefixSpan(prefixSeq,sdList,1); times++; log.info("执行到itemId-{},已经循环到{}",newString[]{prefixSeq[0],times+""}); } returnthis.maxFrSeqs; } publicstaticvoidmain(String[]args){ Stringsequence[]={"a","a,b,c","a,c","d","c,f","a,d","a,b,c","a,d","d,e","e,f", "a,b","d,f","c","b","e","g","a,f","c","b","c"}; List List Stringe=null; List for(inti=0;i<5;i++){ e=sequence[i]; if(e! =null){ items=newArrayList for(Stringitem: e.split(",")){ items.add(item); } Collections.sort(items); e1.add(items); } } List for(inti=5;i<9;i++){ e=sequence[i]; if(e! =null){ items=newArrayList for(Stringitem: e.split(",")){ items.add(item); } Collections.sort(items); e2.add(items); } } List for(inti=9;i<14;i++){ e=sequence[i]; if(e! =null){ items=newArrayList for(Stringitem: e.split(",")){ items.add(item); } Collections.sort(items); e3.add(items); } } List for(inti=14;i<20;i++){ e=sequence[i]; if(e! =null){ items=newArrayList for(Stringitem: e.split(",")){ items.add(item); } Collections.sort(items); e4.add(items); } } sLists.add(e1); sLists.add(e2); sLists.add(e3); sLists.add(e4); PrefixSpanBuildtest=newPrefixSpanBuild(sLists,2,2); test.buildPrefixSpan(); System.out.println("序列数据库如下: "); for(List test.sequences){ for(List elem){ System.out.print(item2s); System.out.print(""); } System.out.println(); } System.out.println(""); System.out.println(""); System.out.println("执行PrefixSpan算法,生成频繁序列模式结果如下: "); //System.out.println(tempti); test.printMaxFrSeq(); } publicvoidprintMaxFrSeq(){ StringBuffertempStrBuf=null; intseqSize=0; for(List maxFrSeqs){ tempStrBuf=newStringBuffer(); seqSize=sequence.size(); tempStrBuf.append("<"); for(inti=0;i StringskuId=sequence.get(i); tempStrBuf.append(skuId+""); } tempStrBuf.append(sequence.get(seqSize-3)); tempStrBuf.append(">"); tempStrBuf.append("-"+sequence.get(seqSize-2)); tempStrBuf.append("-"+sequence.get(seqSize-1)); log.info(((tempStrBuf.toString()))); } } /** *根据前缀生成投影数据库 *@paramseqs序列数据库S */ publicList returngenerateSD(seqs,newString[]{prefixSeq}); } /** *根据前缀生成投影数据库 *@paramprefixSeq前缀 */ publicList returngenerateSD(sequences,newString[]{prefixSeq}); } /** *根据前缀生成投影数据库 *@paramseqs序列数据库S */ publicList List List List List for(List seqs){ sdElem=newArrayList for(List elem){ intn=containArra>>sdSeqs){
>>sdSeqs){
>sdElem:
>>seqs,intprefixNum){
>>sdSeqs=generateSD(seqs,tempSeq);
>>sdSeqs=generateSD(seqs,tempSeq1s);
>buildPrefixSpan(){
>>sdList=this.generateSD(itemId);
>>sLists=newArrayList
>>();
>e1=newArrayList
>();
>e2=newArrayList
>();
>e3=newArrayList
>();
>e4=newArrayList
>();
>elem:
>>generateSD(List
>>seqs,StringprefixSeq){
>>generateSD(StringprefixSeq){
>>generateSD(List
>>seqs,String[]prefixSeq){
>>sdList=newArrayList
>>();
>sdElem=null;
>retainsdElem=null;
>elem:
>();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- prefixspan 算法 java 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)