一.关联算法简介。
关联规则的目的在于在一个数据集中找出项之间的关系,也称之为购物蓝分析 (market basketanalysis)。例如,购买鞋的顾客,有10%的可能也会买袜子,60%的买面包的顾客,也会买牛奶。这其中最有名的例子就是"尿布和啤酒"的故事了。
关联规则的应用场合。在商业销售上,关联规则可用于交叉销售,以得到更大的收入;在保险业务方面,如果出现了不常见的索赔要求组合,则可能为欺诈,需要作进一步的调查。在医疗方面,可找出可能的**组合;在银行方面,对顾客进行分析,可以推荐感兴趣的服务等等。
apriori algorithm是关联规则里一项基本算法。由rakesh agrawal 在 2023年提出的,详细的介绍请猛击这里《fast algorithms for mining association rules》。
二。关联算法的基本原理。
该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。
然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。
1)l1 = find_frequent_1-itemsets(d挖掘频繁1-项集,比较容易。
2)for (k=2;lk-1 ≠φk++)
9)lk =
11) return l= ∪k lk合并频繁k-项集(k>0)
三。关联算法的c++简单实现。
1)算法数据:
对给定数据集用apriori算法进行挖掘,找出其中的频繁集并生成关联规则。对下面数据集进行挖掘:
对于数据集,取最小支持度minsup=2,最小置信度minconf=0.8。
2)算法步骤:
① 首先单趟扫描数据集,计算各个一项集的支持度,根据给定的最小支持度闵值,得到一项频繁集l1。
然后通过连接运算,得到二项候选集,对每个候选集再次扫描数据集,得出每个候选集的支持度,再与最小支持度比较。得到二项频繁集l2。
如此进行下去,直到不能连接产生新的候选集为止。
对于找到的所有频繁集,用规则提取算法进行关联规则的提取。
3)c++算法的简单实现。
①首先要在工程名文件夹里自己定义文档存放数据,然后在main函数中用file* fp=fopen(""r");将数据导入算法。
②定义int countl1[10];找到各一维频繁子集出现的次数。
定义char curl1[20][2];实现出现的一维子集。
由于给出的数据最多有4个数,所以同样的我们要定义到4维来放数据。
int countl2[10]; 各二维频繁子集出现的次数。
char curl2[20][3]; 出现的二维子集。
int countl3[10]; 各三维频繁子集出现的次数。
char curl3[20][4]; 出现的三维子集。
char cur[50][4];
③定义int sizestr(char* m) 得到字符串的长度。实现**如下:
int sizestr(char* m)
int i=0;
while(*(m+i)!=0)
return i;
比较两个字符串,如果相等返回true,否则返回false
bool opd(char* x,char* y)
int i=0;
if(sizestr(x)==sizestr(y))
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;i<20;i++)
for(j=0;j<10;j++)
countl1[j]=0;
for(i=0;i<10;i++)
for(j=0;j<4;j++)
curl1[0][0]=cur[0][0];
curl1[0][1]=cur[0][1];
k=0;for(i=0;i<50;i++)
if(f==1)
for(i=0;i<20;i++)
for(j=0;j<50;j++)
printf("l1: ")
printf("项集支持度计数");
for(i=0;i<10;i++)
通过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;i<20;i++)
for(i=0;i<10;i++)
countl2[i]=0;
for(k=0;k<10;k++)
通过void loaditeml2(char **p) 得到各个2元频繁子串出现的次数。
void loaditeml2(char **p)
int k,i,j;
char* s;
int f;
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(f==1)
for(i=0;i<20;i++)
for(j=0;j<50;j++)
printf("l2: ");
printf("项集支持度计数");
for(i=0;i<10;i++)
通过定义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;j<20;j++)
for(i=0;i<10;i++)
countl3[i]=0;
for(m=0;m<10;m++)
同样我们要得到得到各个3元频繁子串出现的次数。
void loaditeml3(char** p)
数据结构与算法课程设计心得体会学习体会 35
课程设计心得体会。因为已经不是第一次做课程设计,所以对过程很是了解。前期准备工作也做的很充足,所以整个过程不慌不乱,有条不紊。总而言之,程序编写过程中,算法思路清晰,但细节处处理粗糙导致走了很多弯路。老师不只一次提到数据结构强调的是算法思路,经过这次课程设计后,我更是有了进一步深切体会。包括我之前在...
数据结构与算法课程设计心得体会学习体会 31
合肥学院。计算机科学与技术系。课程设计的心得体会。2009 2010 学年第二学期。2010年6 月。通过这次课程设计我自学了拓扑排序,使我对其排序方法和应用有了更深刻的了解。对于数据结构如何用c语言表述有了更深刻的体会和了解。在用c语言表述数据结构时遇到了不小的困难。总是在编译时错误连篇无法运行,...
数据结构实习报告
精选范文 数据结构实习报告 共2篇 一 需求分析1 程序所实现的功能 2 程序的输入,包含输入的数据格式和说明 3 程序的输出,程序输出的形式 4 测试数据,如果程序输入的数据量比较大,需要给出测试数据 5 合作人及其分工。二 设计说明1 主要的数据结构设计说明 2 程序的主要流程图 3 程序的主要...