Apriori算法-数组-C语言
原文地址:http://blog.csdn.net/liema2000/article/details/6118423
#include<stdio.h>
typedef struct
{
int item[100]; //数据项
} D_Node; //数据库D
typedef struct
{
int item[100]; //数据项,用item[0]保存支持度
} C_Node; //候选集
typedef struct
{
int item[100]; //数据项,用item[0]保存支持度
} L_Node;//频繁集
C_Node C[100][100];
L_Node L[100][100];
D_Node D[100];
int min_supp; //最小支持度
void InPut()
{
int i,j,n,n1;//n是交易集的大小,n1是输入的记录个数,数据输入到D[100]中
printf("请输入最小支持度:");
scanf("%d",&min_supp);
printf("请输入交易集的大小");
scanf("%d",&D[0].item[0]);
n=D[0].item[0];
for(i=1;i<=n;i++) //for1
{
printf("请输入交易[%d]中记录的个数(n)",i);
scanf("%d",&n1);
D[i].item[0]=n1;
for(j=1;j<=n1;j++) //for2
{
printf("请输入交易[%d]中记录项,直接输入数字:",i);
scanf("%d",&D[i].item[j]);
}//for2
} //for1
}//end of InPut
void C1()
{
//功能:扫描数据集D生成1项候选集C1
//输入:数据集D
//输出1项候选集C1
//初始条件 数据集D 非空
/* 将D放入C中,D[0]item[0]是交易集个数,D[1]item[0]是第一个交易集的数据项个数,
D[1]item[1]到D[1]item[个数]是第一个交易集合的数据。
c不管交易集个数,只看数据项。C[n][k].item[0]是候选集Cn的第k项的支持度,
c[1][1]item[1]数据项,c[1][1]item[0]此数据项的个数。c[1][0]item[0]中no是不同数据项的个数。
*/
int i,j,k;
int no=1,temp=0; //no是不重复的数据项的个数
C[1][0].item[0]=0; //1 项集的个数,在本算法中,用C[n][k].item[0]来保存候选集Cn的第k项的支持度
if(D[0].item[0]!=0)
{
C[1][1].item[1]=D[1].item[1];
}
for(i=1;i<=D[0].item[0];i++) //for1 交易集
{
for(j=1;j<=D[i].item[0];j++) //for2 某个交易集中的记录
{
temp=1;
for(k=1;k<=no;k++) //for3
{
if(C[1][k].item[1]==D[i].item[j])
{
C[1][k].item[0]++; //支持度加1
temp=0;
} //if
}//end for3
if(temp)//生成新的项集
{
C[1][++no].item[1]=D[i].item[j];
C[1][no].item[0]=1;
}
}//end for2
} // end for1
C[1][0].item[0]=no;//数据项的个数
} //end of C1()
void Cn( int n)
{
//用频繁集Ln-1为基础,通过连接得到n项候选集Cn
int i,j,k,p,q,s,t,num;
int no=0,temp=0,count;
C[n][0].item[0]=0; //初始化
num=L[n-1][0].item[0]; //num是Ln-1项集的数据个数
for(i=1;i<=num;i++)
for(j=i+1;j<=num;j++) //for2
{
temp=1; //测试是否满足联结条件
if(n>2)//if 1 不是一项集连时,可能有重复项
{
for(k=1;k<n-1;k++) //for3
{
if(L[n-1][i].item[k]!=L[n-1][j].item[k])//相同位置有相同的项才可以连接
{
temp=0;
break;
}//if 1
}//end for3
}//end if1
if(temp==1)//满足联结条件
{
no++;
for(p=1;p<=n-1;p++)
C[n][no].item[p]=L[n-1][i].item[p];
C[n][no].item[p]=L[n-1][j].item[p-1]; //这行p是执行p++之后的,比上行p大1
C[n][no].item[0]=0;
for(q=1;q<=D[0].item[0];q++) //for5 测试其支持度
{
count=0; //count用来记数,当所测试的项存在时,count加1,当count=n时,则子集存在
for(s=1;C[n][no].item[s]!=0;s++) //for6
{
for(t=1;t<=D[q].item[0];t++) //for7
{
if(C[n][no].item[s]==D[q].item[t])
{ count+=1;
break;
}
}//end for7
}//end for 6
if(count==n) C[n][no].item[0]+=1;//子集存在,第no项的支持度加1
}//end for5
C[n][0].item[0]+=1;
}//end if2
}//end for2
}//end of Cn()
void Ln(int n)
{
int i,j,k;
j=0;
L[n][0].item[0]=0;
for(i=1;i<=C[n][0].item[0];i++) //for 1
{
if(C[n][i].item[0]>=min_supp)
{
j+=1;
for(k=1;k<=n;k++)
L[n][j].item[k]=C[n][i].item[k];
L[n][j].item[0]=C[n][i].item[0];
} //end if
}//end for1
L[n][0].item[0]=j; //保存数据的个数
}//end of Ln(int n)
void OutPut(int n)
{
int i,j,k;
printf("频繁项目集L%d如下:\n",n);
k=L[n][0].item[0];
if(k!=0)
{
for(i=1;i<=k;i++)
{
printf("{");
for(j=1;j<=n;j++)
printf(" I%d ",L[n][i].item[j]);
printf("} 支持度:%d\n",L[n][i].item[0]);
}//for
}
else
printf("项目集为空\n");
}
void main()
{
int i;
int n=1;
InPut();
C1();//初始化,生成1项候选集C1
Ln(1);//得到1项频繁集L1
while(L[n][0].item[0]!=0)
{
n+=1;
Cn(n);
Ln(n);
}
for(i=1;i<=n;i++)
OutPut(i);
}
效果图:

测试案例:(我的疑惑点)
令交易4的记录为23,34则L2中是12,23两次 23,34三次。这种情况不会生成频繁三项集。
如果12,23,34是频繁的,则12,23和12,24都是频繁的。所以如果判断得到相同位置项集相同才会连接。
Apriori算法-数组-C语言的更多相关文章
- 一步步教你轻松学关联规则Apriori算法
一步步教你轻松学关联规则Apriori算法 (白宁超 2018年10月22日09:51:05) 摘要:先验算法(Apriori Algorithm)是关联规则学习的经典算法之一,常常应用在商业等诸多领 ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 无限大整数相加算法的C语言源代码
忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里. 500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒. 下面是 ...
- 数据结构算法集---C++语言实现
//数据结构算法集---C++语言实现 //各种类都使用模版设计,可以对各种数据类型操作(整形,字符,浮点) /////////////////////////// // // // 堆栈数据结构 s ...
- 玩转大数据:深入浅出大数据挖掘技术(Apriori算法、Tanagra工具、决策树)
一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 “大数据”作为时下最火热的IT行业的词汇,随之而来的数据仓库.数据分析.数据挖掘等等围绕大数据的商业价值的利用逐渐成为 ...
- 购物篮模型&Apriori算法
一.频繁项集 若I是一个项集,I的支持度指包含I的购物篮数目,若I的支持度>=S,则称I是频繁项集.其中,S是支持度阈值. 1.应用 "尿布和啤酒" 关联概念:寻找多篇文章中 ...
- 【机器学习实战】第11章 使用 Apriori 算法进行关联分析
第 11 章 使用 Apriori 算法进行关联分析 关联分析 关联分析是一种在大规模数据集中寻找有趣关系的任务. 这些关系可以有两种形式: 频繁项集(frequent item sets): 经常出 ...
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法
http://blog.csdn.net/pipisorry/article/details/48901217 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
随机推荐
- mx51的三个framebuffer,mxc_ipuv3_fb.c分析
转载:http://blog.csdn.net/jack_a8/article/details/43309169 mx51支持三个framebuffer:fb0, fb1, fb2 /dev/grap ...
- jx problem
Entity: line 37: parser error : xmlParseEntityRef: no nameecho "xxxxxx > /dev/null 2>& ...
- 1.1 office安装
2013版安装链接: https://pan.baidu.com/s/1qYMuidA 密码: uj9e
- centos7下编译安装nginx1.10
1.下载pcre 下载地址:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 解压到/usr/local/pcre8.3.9 2.下载ope ...
- Managed Switch: Confs
shortcuts: c-w: delete word before c-a: move to first char c-y: delete everything after cursor c-z: ...
- C# lesson3
一.局部变量和成员变量 1.程序入口(Main)要调用非静态成员(变量或方法)的话,是需要通过对象去调用的: 2.普通方法里面去调用变量或方法的话可以直接调用 成员变量(全局变量):放在Main方法之 ...
- 用VB把xlsx转换为xls
Sub Test()Dim wb As Workbook, mPath As String, f As StringApplication.DisplayAlerts = FalseApplicati ...
- Adding DOM elements to document
1.JavaScript 添加DOM Element 执行效率比较: 抄自:http://wildbit.com/blog/2006/11/21/javascript-optimization-add ...
- 【MySQL】使用 Optimizer Trace 观察SQL执行过程
Optimizer Trace 是MySQL 5.6.3里新加的一个特性,可以把MySQL Optimizer的决策和执行过程输出成文本.输出使用JSON格式,便于程序分析和人类阅读. 使用方法 1) ...
- 【第一篇】Volley的使用之json请求
最近项目写完,有开始新的学习了,volley很久以前就接触了,也看了源码,然而却没有通过文章去记录自己的学习成果. 首先讲下volley的特点: 1,扩展性强.Volley 中大多是基于接口的设计,可 ...