数据挖掘读书报告.docx
- 文档编号:11001704
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:23
- 大小:224.75KB
数据挖掘读书报告.docx
《数据挖掘读书报告.docx》由会员分享,可在线阅读,更多相关《数据挖掘读书报告.docx(23页珍藏版)》请在冰点文库上搜索。
数据挖掘读书报告
读书报告
数据挖掘可以看成是信息技术自然化的结果。
数据挖掘(Datamining),又译为资料探勘、数据采矿。
它是数据库知识发现(Knowledge-DiscoveryinDatabases,简称:
KDD)中的一个步骤。
数据挖掘一般是指从大量的数据中自动搜索隐藏于其中的有着特殊关系性(属于Associationrulelearning)的信息的过程。
数据挖掘通常与计算机科学有关,并通过统计、在线分析处理、情报检索、机器学习、专家系统(依靠过去的经验法则)和模式识别等诸多方法来实现上述目标。
数据挖掘利用了来自如下一些领域的思想:
(1)来自统计学的抽样、估计和假设检验,
(2)人工智能、模式识别和机器学习的搜索算法、建模技术和学习理论。
数据挖掘也迅速地接纳了来自其他领域的思想,这些领域包括最优化、进化计算、信息论、信号处理、可视化和信息检索。
一些其他领域也起到重要的支撑作用。
特别地,需要数据库系统提供有效的存储、索引和查询处理支持。
源于高性能(并行)计算的技术在处理海量数据集方面常常是重要的。
分布式技术也能帮助处理海量数据,并且当数据不能集中到一起处理时更是至关重要。
数据挖掘是一种决策支持过程,它主要基于人工智能、机器学习、模式识别、统计学、数据库、可视化技术等,高度自动化地分析企业的数据,做出归纳性的推理,从中挖掘出潜在的模式,帮助决策者调整市场策略,减少风险,做出正确的决策。
知识发现过程由以下三个阶段组成:
(1)数据准备
(2)数据挖掘(3)结果表达和解释。
数据挖掘可以与用户或知识库交互。
数据挖掘的任务有关联分析、聚类分析、分类分析、异常分析、特异群组分析和演变分析,等等。
数据挖掘完整的步骤如下:
①理解数据和数据的来源(understanding)。
②获取相关知识与技术(acquisition)。
③整合与检查数据(integrationandchecking)。
④去除错误或不一致的数据(datacleaning)。
⑤建立模型和假设(modelandhypothesisdevelopment)。
⑥实际数据挖掘工作(datamining)。
⑦测试和验证挖掘结果(testingandverification)。
⑧解释和应用(interpretationanduse)。
数据挖掘应用到生活的各个方面,数据挖掘的十大经典算法也随着数据挖掘技术的发展而不断的改进和完善,其中Apriori算法是十大经典算法中最为经典的一种算法,该算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集。
而且算法已经被广泛的应用到商业、网络安全等各个领域。
关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物蓝分析(marketbasketanalysis)。
例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。
这其中最有名的例子就是"尿布和啤酒"的故事了。
关联规则的应用场合。
在商业销售上,关联规则可用于交叉销售,以得到更大的收入;在保险业务方面,如果出现了不常见的索赔要求组合,则可能为欺诈,需要作进一步的调查。
在医疗方面,可找出可能的治疗组合;在银行方面,对顾客进行分析,可以推荐感兴趣的服务等等。
Apriorialgorithm是关联规则里一项基本算法。
关联算法的基本思想是:
首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。
然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。
然后使用第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)foreachtransactiont∈D{ //扫描事务数据库D
(5)Ct=subset(Ck,t);
(6)foreachcandidatec∈Ct
(7)c.count++;// 统计候选频繁k-项集的计数
(8)}
(9)Lk={c∈Ck|c.count≥min_sup}//满足最小支持度的k-项集即为频繁k-项集
(10)}
(11)returnL=∪kLk;//合并频繁k-项集(k>0)
Apriori算法就是运用了关联规则的算法思想。
以下是Apriori算法的流程图:
Apriori算法的两大缺点:
可能产生大量的候选集,以及可能需要重复扫描数据库。
提高apriori算法的效率:
1、基于散列的技术(散列项集到对应的桶中)
一种基于散列的技术可以用于压缩候选K项集Ck(k>1)。
2、事务压缩(压缩未来迭代扫描的事务数);不包含任何频繁K项集的事务不可能包含任何频繁(k+1)项集。
因此,这种事务在其后的考虑时,可以加上标记或删除,因为产生J项集(j>k)的数据库扫描不再需要他们。
3、划分(为寻找候选项集划分数据)
4、抽样(对给定数据的子集挖掘)
5、动态项集技术(在扫描的不同点添加候选项集)
关联算法的C++简单实现
(1)算法数据:
对给定数据集用Apriori算法进行挖掘,找出其中的频繁集并生成关联规则。
对下面数据集进行挖掘:
I1I2I5
I1I2
I2I4
I1I2I4
I1I3
I1I2I3I5
I1I2I3
I2I5
I2I3I4
I3I4
对于数据集,取最小支持度minsup=2,最小置信度minconf=0.8。
(2)算法步骤:
①首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度闵值,得到一项频繁集L1。
②然后通过连接运算,得到二项候选集,对每个候选集再次扫描数据集,得出每个候选集的支持度,再与最小支持度比较。
得到二项频繁集L2。
③如此进行下去,直到不能连接产生新的候选集为止。
④对于找到的所有频繁集,用规则提取算法进行关联规则的提取。
(3)C++算法的简单实现
①首先要在工程名文件夹里自己定义date.txt文档存放数据,然后在main函数中用FILE*fp=fopen("date.txt","r");将数据导入算法。
②定义intcountL1[10];找到各一维频繁子集出现的次数。
定义charcurL1[20][2];实现出现的一维子集。
由于给出的数据最多有4个数,所以同样的我们要定义到4维来放数据。
intcountL2[10];//各二维频繁子集出现的次数
charcurL2[20][3];//出现的二维子集
intcountL3[10];//各三维频繁子集出现的次数
charcurL3[20][4];//出现的三维子集
charcur[50][4];
③定义intSizeStr(char*m)得到字符串的长度。
实现代码如下:
intSizeStr(char*m)
{
inti=0;
while(*(m+i)!
=0)
{
i++;
}
returni;
}
④比较两个字符串,如果相等返回true,否则返回false
boolOpD(char*x,char*y)
{
inti=0;
if(SizeStr(x)==SizeStr(y))
{
while(*(x+i)==*(y+i))
{
i++;
if(*(x+i)==0&&*(y+i)==0)
returntrue;
}
}
returnfalse;
}
⑤通过voidLoadItemL1(char**p)得到所有1元的字串和各自出现的次数
voidLoadItemL1(char**p)
{
inti,j,n=0,k=0;
charch;
char*s;
intf;
memset(cur,0,sizeof(cur));
for(i=0;i<20;i++)
{
curL1[i][0]=0;
curL1[i][1]=0;
}
for(j=0;j<10;j++)
countL1[j]=0;
for(i=0;i<10;i++)
for(j=0;j<4;j++)
{
ch=*(*(p+i)+j);
if(ch==0)
break;
cur[n][0]=ch;
n++;
}
curL1[0][0]=cur[0][0];
curL1[0][1]=cur[0][1];
k=0;
for(i=0;i<50;i++)
{
if(cur[i]==0)
break;
s=cur[i];
f=1;
for(j=0;j<=k;j++)
{
if(OpD(s,curL1[j]))
{
f=0;
break;
}
}
if(f==1)
{
++k;
curL1[k][0]=cur[i][0];
curL1[k][1]=cur[i][1];
}
}
for(i=0;i<20;i++)
for(j=0;j<50;j++)
{
char*m;
m=curL1[i];
if(*m==0)
break;
if(OpD(m,cur[j]))
countL1[i]++;
}
printf("L1:
\n");
printf("项集支持度计数\n");
for(i=0;i<10;i++)
{
if(curL1[i]==0)
break;
if(countL1[i]>=2)
printf("{I%s}:
%d\n",curL1[i],countL1[i]);
}
}
⑥通过voidSubItem2(char**p)得到所有的2元子串
voidSubItem2(char**p)
{
inti,j,k,n=0;
char*s;
memset(cur,0,sizeof(cur));
for(i=0;i<20;i++)
{
curL2[i][0]=0;
curL2[i][1]=0;
curL2[i][2]=0;
}
for(i=0;i<10;i++)
countL2[i]=0;
for(k=0;k<10;k++)
{
s=*(p+k);
if(SizeStr(s)<2)
continue;
for(i=0;i for(j=i+1;j { if(*(s+j)==0) break; *(cur[n]+0)=*(s+i); *(cur[n]+1)=*(s+j); *(cur[n]+2)=0; *(cur[n]+3)=0; n++; } } } ⑦通过voidLoadItemL2(char**p)得到各个2元频繁子串出现的次数 voidLoadItemL2(char**p) { intk,i,j; char*s; intf; SubItem2(p); curL2[0][0]=cur[0][0]; curL2[0][1]=cur[0][1]; curL2[0][2]=cur[0][2]; k=0; for(i=0;i<50;i++) { if(cur[i]==0) break; s=cur[i]; f=1; for(j=0;j<=k;j++) { if(OpD(s,curL2[j])) { f=0; break; } } if(f==1) { ++k; curL2[k][0]=cur[i][0]; curL2[k][1]=cur[i][1]; curL2[k][2]=cur[i][2]; } } for(i=0;i<20;i++) for(j=0;j<50;j++) { s=curL2[i]; if(*s==0) break; if(OpD(s,cur[j])) countL2[i]++; } printf("L2: \n"); printf("项集支持度计数\n"); for(i=0;i<10;i++) { if(curL2[i]==0) break; if(countL2[i]>=2) printf("{I%c,I%c}: %d\n",curL2[i][0],curL2[i][1],countL2[i]); } } ⑧通过定义voidSubItem3(char**p)得到所有3元的子串 voidSubItem3(char**p) { char*s; inti,j,h,m; intn=0; memset(cur,0,sizeof(cur)); for(j=0;j<20;j++) { curL3[j][0]=0; curL3[j][1]=0; curL3[j][2]=0; curL3[j][3]=0; } for(i=0;i<10;i++) countL3[i]=0; for(m=0;m<10;m++) { s=*(p+m); if(SizeStr(s)<3) continue; for(i=0;i for(j=i+1;j { for(h=j+1;h { if(*(s+h)==0) break; *(cur[n]+0)=*(s+i); *(cur[n]+1)=*(s+j); *(cur[n]+2)=*(s+h); *(cur[n]+3)=0; n++; } } } } ⑨同样我们要得到得到各个3元频繁子串出现的次数 voidLoadItemL3(char**p) { intk,i,j; char*s; intf; SubItem3(p); curL3[0][0]=cur[0][0]; curL3[0][1]=cur[0][1]; curL3[0][2]=cur[0][2]; curL3[0][3]=cur[0][3]; k=0; for(i=0;i<50;i++) { if(cur[i]==0) break; s=cur[i]; f=1; for(j=0;j<=k;j++) { if(OpD(s,curL3[j])) { f=0; break; } } if(f==1) { ++k; curL3[k][0]=cur[i][0]; curL3[k][1]=cur[i][1]; curL3[k][2]=cur[i][2]; curL3[k][3]=cur[i][3]; } } for(i=0;i<20;i++) for(j=0;j<50;j++) { s=curL3[i]; if(*s==0) break; if(OpD(s,cur[j])) countL3[i]++; } printf("L3: \n"); printf("项集支持度计数\n"); for(i=0;i<10;i++) { if(curL3[i]==0) break; if(countL3[i]>=2) printf("{I%c,I%c,I%c}: %d\n",curL3[i][0],curL3[i][1],curL3[i][2],countL3[i]); } } ⑩定义voidLoadItemL4(char**p)得到各个3元子串出现的次数 voidLoadItemL4(char**p) { inti; char*s; intj=0; for(i=0;i<10;i++) { s=*(p+i); if(SizeStr(s)==4) j++; } printf("四维子集出现的次数: %d\n",j); printf("没有四维的频繁子集,算法结束! \n"); } 通过voidSupport(char*w,intg)得到关联规则,并输出结果 voidSupport(char*w,intg) { inti,j,k,n=0; char*s; floatc=0.8,d=0; memset(cur,0,sizeof(cur)); s=w; for(i=0;i { *(cur[n]+0)=*(s+i); *(cur[n]+1)=0; *(cur[n]+2)=0; *(cur[n]+3)=0; n++; } for(i=0;i for(j=i+1;j { if(*(s+j)==0) break; *(cur[n]+0)=*(s+i); *(cur[n]+1)=*(s+j); *(cur[n]+2)=0; *(cur[n]+3)=0; n++; } for(i=0;i<10;i++) { if(SizeStr(cur[i])==1) { for(j=0;j<10;j++) { if(OpD(cur[i],curL1[j])) { d=countL3[g]/(float)countL1[j]; if(d>=c) printf("{I%s}: %f",curL1[i],d); break; } } } if(SizeStr(cur[i])==2) { for(j=0;j<10;j++) { if(OpD(cur[i],curL2[j])) { d=countL3[g]/(float)countL2[j]; if(d>=c) printf("{I%c,I%c}: %f\n",curL2[j][0],curL2[j][1],d); break; } } } } } 最后通过main函数完成整过程序 intmain(intargc,char*argv[]) { inti=0,j=0,k; charbuf[10][6]; char*p[10]; charch; memset(buf,0,sizeof(buf)); FILE*fp=fopen("date.txt","r"); if(fp==NULL) return0; ch=fgetc(fp); while(ch! =EOF) { if(ch==0xa||ch==0xd) { i++; ch=fgetc(fp); j=0; continue; } buf[i][j]=ch; j++; ch=fgetc(fp); } for(k=0;k<10;k++) { *(p+k)=buf[k]; } LoadItemL1(p); LoadItemL2(p); LoadItemL3(p); LoadItemL4(p); printf("产生关联规则: \n"); printf("非空子集: 置信度: \n"); for(i=0;i<10;i++) { if(curL3[i]! =0&&countL3[i]>=2) Support(curL3[i],i); } return0; } (4)程序输出结果: 学习“数据挖掘”这门课程已经有一个学期了,在过程中,我对数据挖掘这门技术有了一定的了解,了解了其中的一些概念,并对其应用以及研究热点有了进一步的认识。 随着数据库技术和计算机网络的迅速发展以及数据库管理系统的广泛应用,人们积累的数据越来越多,而数据挖掘(DataMining)就是在这样的背景下诞生的。 简单说,数据挖掘就是从大量的数据中,抽取出潜在的、有价值的知识、模型或规则的过程。 作为一类深层次的数据分析方法,它利用了数据库、人工智能和数理统计等多方面的技术。 数据挖掘正是为了解决传统分析方法的不足,并针对大规模数据的分析处理而出现的。 数据挖掘可以帮助人们对大规模数据进行高效的分析处理,以节约时间,将更多的精力投入到更高层的研究中,从而提高科研工作的效率。 数据挖掘的研究领域非常广泛,主要包括数据库系统、基于知识的系统、人工智能、机器学习、知识获取、统计学、空间数据库和数据可视化等领域。 在本学期的学习过程中,建立了一些基本的概念,对将来从事相关方向的研究奠定了基础。 例如关于“尿布与啤酒”的故事: 在一家超市里,尿布和啤酒被摆在一起出售,但是这个奇怪的举措却使尿布和啤酒的销量双双增加。 这个故事在一定程度上说明了数据挖掘技术的巨大价值。 总之,数据挖掘技术是一个发展十分迅速的领域,随着数据挖掘技术在各领域日益广泛的应用,越来越多的学者会投入到相关的研究中来。 就我个人而言,我也会继续关注数据挖掘技术的最新研究进展,努力为今后的课题研究打好基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 挖掘 读书 报告