数据挖掘Apriori算法报告.doc_第1页
数据挖掘Apriori算法报告.doc_第2页
数据挖掘Apriori算法报告.doc_第3页
数据挖掘Apriori算法报告.doc_第4页
数据挖掘Apriori算法报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据挖掘Apriori算法报告一关联算法简介关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物蓝分析 (market basketanalysis)。例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。这其中最有名的例子就是尿布和啤酒的故事了。关联规则的应用场合。在商业销售上,关联规则可用于交叉销售,以得到更大的收入;在保险业务方面,如果出现了不常见的索赔要求组合,则可能为欺诈,需要作进一步的调查。在医疗方面,可找出可能的治疗组合;在银行方面,对顾客进行分析,可以推荐感兴趣的服务等等。Apriori algorithm是关联规则里一项基本算法。由Rakesh Agrawal 在 1994年提出的,详细的介绍请猛击这里Fast Algorithms for Mining Association Rules。二.关联算法的基本原理 该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法(1)L1 = find_frequent_1-itemsets(D); / 挖掘频繁1-项集,比较容易(2)for (k=2;Lk-1 ;k+) (3)Ck = apriori_gen(Lk-1 ,min_sup); / 调用apriori_gen方法生成候选频繁k-项集(4)for each transaction t D / 扫描事务数据库D(5)Ct = subset(Ck,t);(6)for each candidate c Ct(7)c.count+; /统计候选频繁k-项集的计数(8)(9)Lk =c Ck|c.countmin_sup / 满足最小支持度的k-项集即为频繁k-项集(10) (11) return L= k Lk; / 合并频繁k-项集(k0)三.关联算法的C+简单实现(1)算法数据:对给定数据集用Apriori算法进行挖掘,找出其中的频繁集并生成关联规则。对下面数据集进行挖掘:I1 I2 I5I1 I2I2 I4I1 I2 I4I1 I3I1 I2 I3 I5I1 I2 I3I2 I5I2 I3 I4I3 I4对于数据集,取最小支持度minsup=2,最小置信度minconf=0.8。(2)算法步骤: 首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度闵值,得到一项频繁集L1。 然后通过连接运算,得到二项候选集,对每个候选集再次扫描数据集,得出每个候选集的支持度,再与最小支持度比较。得到二项频繁集L2。 如此进行下去,直到不能连接产生新的候选集为止。 对于找到的所有频繁集,用规则提取算法进行关联规则的提取。(3)C+算法的简单实现 首先要在工程名文件夹里自己定义date.txt文档存放数据,然后在main函数中用FILE* fp=fopen(date.txt,r);将数据导入算法。 定义int countL110;找到各一维频繁子集出现的次数。定义char curL1202;实现出现的一维子集。由于给出的数据最多有4个数,所以同样的我们要定义到4维来放数据。int countL210; /各二维频繁子集出现的次数char curL2203; /出现的二维子集int countL310; /各三维频繁子集出现的次数char curL3204; /出现的三维子集char cur504; 定义int SizeStr(char* m) 得到字符串的长度。实现代码如下: int SizeStr(char* m)int i=0;while(*(m+i)!=0)i+;return i;比较两个字符串,如果相等返回true,否则返回false bool OpD(char* x,char* y)int i=0;if(SizeStr(x)=SizeStr(y)while(*(x+i)=*(y+i)i+;if(*(x+i)=0 & *(y+i)=0)return true;return false;通过void LoadItemL1(char *p) 得到所有1元的字串和各自出现的次数 void LoadItemL1(char *p)int i,j,n=0,k=0;char ch;char* s;int f;memset(cur,0,sizeof(cur);for(i=0;i20;i+)curL1i0=0;curL1i1=0;for(j=0;j10;j+)countL1j=0;for(i=0;i10;i+)for(j=0;j4;j+)ch=*(*(p+i)+j);if(ch=0)break;curn0=ch;n+;curL100=cur00;curL101=cur01;k=0;for(i=0;i50;i+)if(curi=0)break;s=curi;f=1;for(j=0;j=k;j+)if(OpD(s,curL1j)f=0;break;if(f=1)+k;curL1k0=curi0;curL1k1=curi1;for(i=0;i20;i+)for(j=0;j50;j+)char* m;m=curL1i;if(*m=0)break;if(OpD(m,curj)countL1i+;printf(L1: n );printf(项集 支持度计数n);for(i=0;i=2)printf(I%s: %dn,curL1i,countL1i);通过void SubItem2(char *p) 得到所有的2元子串 void SubItem2(char *p)int i,j,k,n=0;char* s;memset(cur,0,sizeof(cur);for(i=0;i20;i+)curL2i0=0;curL2i1=0;curL2i2=0;for(i=0;i10;i+)countL2i=0;for(k=0;k10;k+)s=*(p+k);if(SizeStr(s)2)continue;for(i=0;iSizeStr(s);i+)for(j=i+1;jSizeStr(s);j+)if(*(s+j)=0)break;*(curn+0)=*(s+i);*(curn+1)=*(s+j);*(curn+2)=0;*(curn+3)=0;n+;通过void LoadItemL2(char *p) 得到各个2元频繁子串出现的次数 void LoadItemL2(char *p)int k,i,j;char* s;int f;SubItem2(p);curL200=cur00;curL201=cur01;curL202=cur02;k=0;for(i=0;i50;i+)if(curi=0)break;s=curi;f=1;for(j=0;j=k;j+)if(OpD(s,curL2j)f=0;break;if(f=1)+k;curL2k0=curi0;curL2k1=curi1;curL2k2=curi2;for(i=0;i20;i+)for(j=0;j50;j+)s=curL2i;if(*s=0)break;if(OpD(s,curj)countL2i+;printf(L2: n);printf(项集 支持度计数n);for(i=0;i=2)printf(I%c,I%c: %dn,curL2i0,curL2i1,countL2i);通过定义void SubItem3(char *p) 得到所有3元的子串 void SubItem3(char *p)char *s;int i,j,h,m;int n=0;memset(cur,0,sizeof(cur);for(j=0;j20;j+)curL3j0=0;curL3j1=0;curL3j2=0;curL3j3=0;for(i=0;i10;i+)countL3i=0;for(m=0;m10;m+)s=*(p+m);if(SizeStr(s)3)continue;for(i=0;iSizeStr(s);i+)for(j=i+1;jSizeStr(s);j+)for(h=j+1;hSizeStr(s);h+)if(*(s+h)=0)break;*(curn+0)=*(s+i);*(curn+1)=*(s+j);*(curn+2)=*(s+h);*(curn+3)=0;n+;同样我们要得到得到各个3元频繁子串出现的次数 void LoadItemL3(char* p)int k,i,j;char* s;int f;SubItem3(p);curL300=cur00;curL301=cur01;curL302=cur02;curL303=cur03;k=0;for(i=0;i50;i+)if(curi=0)break;s=curi;f=1;for(j=0;j=k;j+)if(OpD(s,curL3j)f=0;break;if(f=1)+k;curL3k0=curi0;curL3k1=curi1;curL3k2=curi2;curL3k3=curi3;for(i=0;i20;i+)for(j=0;j50;j+)s=curL3i;if(*s=0)break;if(OpD(s,curj)countL3i+;printf(L3: n);printf(项集 支持度计数n);for(i=0;i=2)printf(I%c,I%c,I%c: %dn,curL3i0,curL3i1,curL3i2,countL3i);定义void LoadItemL4(char* p) 得到各个3元子串出现的次数 void LoadItemL4(char* p)int i;char* s;int j=0;for(i=0;i10;i+)s=*(p+i);if(SizeStr(s)=4)j+;printf(四维子集出现的次数: %dn,j);printf(没有四维的频繁子集,算法结束! n);通过void Support(char* w,int g) 得到关联规则,并输出结果 void Support(char* w,int g)int i,j,k,n=0;char* s;float c=0.8,d=0;memset(cur,0,sizeof(cur);s=w;for(i=0;iSizeStr(s);i+)*(curn+0)=*(s+i);*(curn+1)=0;*(curn+2)=0;*(curn+3)=0;n+;for(i=0;iSizeStr(s);i+)for(j=i+1;jSizeStr(s);j+)if(*(s+j)=0)break;*(curn+0)=*(s+i);*(curn+1)=*(s+j);*(curn+2)=0;*(curn+3)=0;n+;for(i=0;i10;i+)if(SizeStr(curi)=1)for(j=0;j=c)printf(I%s: %f,curL1i,d);break;if(SizeStr(curi)=2)for(j=0;j=c)printf(I%c,I%c: %f n,curL2j0,curL2j1,d);break;最后通过main函数完成整过程序 int main(int argc, char* argv)int i=0,j=0,k;char buf106;char* p10;char ch;memset(buf,0,sizeof(buf);FILE* fp=fopen(date.txt,r);if(fp=NULL)return 0;ch=fgetc(fp);while(ch!=EOF)if(ch=0xa | ch=0xd)i+;ch=fgetc(fp);j=0;continue;bufij=ch;j+;ch=fgetc(fp);for(k=0;k10;k+)*(p+k)=bufk;LoadItemL1(p);LoadItemL2(p);LoadItemL3(p);LoadItemL4(p);printf(产生关联规则: n);printf(非空子集: 置信度:n);for(i=0;i=2)Support(curL3i,i);return 0;(4)程序输出结果: 四.学习心得体会 关联算法基本原理学习思路简单,只需一步一步找出频集。再通过支持度算出可信度,如对于AC,support=support(A,C),confidence= support(A,C)/support(A)。其中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论