apriori java_Apriori算法的JAVA实现

1 packageapriori;2 import java.io.*;3 import java.util.*;4 public classApriori {5 public static voidmain(String[] args) {6 long t=System.currentTimeMillis();7 File f=new File("E:/T10I4D100K.dat");8 File fout=new File("E:/ItemSet.txt");9 Scan scan=newScan(f);10 System.out.println("第一次扫描文件耗时 : "+(System.currentTimeMillis()-t)/1000f+" 秒 ");11 System.out.print("输入最小支持度:");12 Scanner reader=new Scanner(System.in); //输入最小支持度

13 scan.minSup=reader.nextInt();14 reader.close();15 t=System.currentTimeMillis();16 try{17 FileWriter out=newFileWriter(fout);18 scan.getItemSetOne();19 for(int i=0;i1){23 scan.Link();24 scan.Cut();25 for(int i=0;i

41 classScan{42 static final int MAX=100000;43 int minSup=2; //最小支持度

44 int dataLength; //data数组的长度

45 intallItemLength;46 Item[] allItem;47 int allItemNumber; //所有项的个数

48 int tNumber; //事务的个数

49 Item[] itemSetOne; //频繁1项集的数组

50 int elementsNumber=0;51 ItemSet[] itemSet; //正在处理的项集的数组

52 intitemSetNumber;53 ItemSet[] setBuffer; //缓存上次处理的项集数组

54 intbufferNumber;55 Scan(File f){56 dataLength=MAX/32+1;57 allItemLength=1000;58 allItem=newItem[allItemLength];59 /*for(int i=0;i

62 try{63 FileReader fs=newFileReader(f);64 BufferedReader ls=newBufferedReader(fs);65 String line=ls.readLine(); //读取一行

66 int r=0; //事务个数

67 int count=0; //给项计数

68 intl,start,end;69 intm,n;70 inti,j;71 while(line!=null&&r

75 for(i=0;i

81 for(j=0;j=allItemLength){90 Item[] temp=allItem;91 int length=2*allItemLength; //将数组长度扩展一倍

92 allItem=newItem[length];93 System.arraycopy(temp, 0, allItem, 0, allItemLength);94 allItemLength=length;95 }96 allItem[count]=newItem(m,dataLength);97 allItem[count].support++;98 allItem[count].data[r/32]+=1<

118 itemSetOne=newItem[allItemNumber];119 int count=0;120 for(int i=0;i=minSup){122 itemSetOne[count]=allItem[i];123 count++;124 }125 }126 Item[] temp=newItem[count];127 System.arraycopy(itemSetOne, 0, temp, 0, count);128 itemSetOne=temp;129 elementsNumber=1;130 itemSetNumber=count;131 }132

133 public voidprintItemSetOne(){134 /*System.out.println("频繁项1项集:");135 for(int i=0;i

139 System.out.println("频繁1项集个数:"+itemSetNumber);140 }141

142 public void Link(){ //连接

143 int count=0;144 elementsNumber++;145 if(elementsNumber==2){146 itemSet=new ItemSet[(itemSetNumber-1)*itemSetNumber/2]; //初始化

147 for(int i=0;i

161 for(int i=0;i=0){169 System.arraycopy(itemSet[i].itemSet, 0, temp[count].itemSet, 1,elementsNumber-1);170 for(k=0;k

182 if(elementsNumber>2){183 ItemSet[] temp=new ItemSet[itemSetNumber]; //暂存剪枝后的结果

184 for(int i=0;i

185 temp[i]=newItemSet(elementsNumber);186 }187 int count=0;188 for(int i=0;i

199 for(int i=0;i

200 temp[i]=newItemSet(elementsNumber);201 }202 int count=0;203 for(int i=0;i=minSup){206 temp[count]=itemSet[i];207 count++;208 }209 }210 itemSet=newItemSet[count];211 System.arraycopy(temp, 0, itemSet, 0, count);212 itemSetNumber=count;213 Print(itemSet,itemSetNumber,elementsNumber);214 }215 public int FigureSupport(int[] itemSet){ //计算支持度

216 int support=0;217 int dataTemp=0;218 Item[] itemTemp=newItem[elementsNumber];219 for(int i=0;i

235 intcount;236 for(count=0;n!=0;count++)237 n&=n-1;238 returncount;239 }240

241 public void Print(ItemSet[] set,int n,int m){ //打印频繁项集的集合

242 System.out.println("频繁"+m+"项集");243 for(int i=0;i

252 int n=a.length;253 inti,j;254 for(i=0;i

261 int n=b.length;262 int m=a.length;263 int dif=-1;264 int difNumber=0;265 inti,j;266 for(i=0;i1) return -1;273 }274 }275 returndif;276 }277

278 public boolean Subset(int i){ //子集测试

279 int n=0;280 for(int j=0;j=0){282 n++;283 }284 }285 if(n==elementsNumber)return true;286 return false;287 }288 }289

290 //项类

291 classItem{292 intitem;293 int[] data; //与该项有关的数据信息

294 int support=0; //项的支持度

295 public Item(int item,intn){296 this.item=item;297 support=0;298 data=new int[n];299 }300 }301 //项集类

302 classItemSet{303 int[] itemSet;304 intsupport;305 ItemSet(intn){306 itemSet=new int[n];307 support=0;308 }309 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值