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 ...
随机推荐
- 如何在IIS6,7中部署ASP.NET网站(转载)
查看web.config文件 web.config通常会放在网站的根目录,这个文件中包含了一最重要的网站运行参数.比如: connectionStrings,httpHandlers,httpModu ...
- use ContourPlot-使用ContourPlot
use ContourPlot to draw implicit function graphics 使用ContourPlot 画隐函数图像 for example $x^{3}+y^{3}-3xy ...
- UIView 和 CALayer 的区别和联系
UIView是在/System/Library/Frameworks/UIKit.framework定义,也就是处于Cocoa Touch层. CALyer是在/System/Library/Fram ...
- 4.请求方式为application/json时的接口测试要如何做?
1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...
- MarkDown初遇
MarkDown初遇 纠结盘桓许久,由于那只胖纸,最终决定再次捡起博客这个东东,记录记录生活中.心灵里的点点滴滴. 寻觅的过程中忽然发现MarkDown这个东东,查了查,学习成本不高,简洁而标准,关键 ...
- linux下安装php的oracle拓展
最近要用Php远程连接第三方的oracle数据库,安装oracle拓展搞了好久,终于弄出来了,现在分享出来: 1,注意安装的客户端版本要和服务端的版本一致,不然会有异常 2,安装之前先要下载三个软件: ...
- 计算机网络课程优秀备考PPT之第三章数据链路层(三)
为了记录自己从2016.9~2017.1的<计算机网络>助教生涯,也为了及时梳理和整写笔记! 前期博客是, 计算机网络课程优秀备考PPT之第一章概述(一) 计算机网络课程优秀备考PPT之第 ...
- Python操作IHTMLDocument2用于自动化测试
有些软件的界面采用Win32窗口嵌套一个IE控件,用Spy++只能识别出一个Internet Explorer_Server控件.常用的几个API函数无法取到IE控件里面的内容,更无法对里面的控件进行 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- 布局常见问题之css实现多行文本溢出显示省略号(…)全攻略
省略号在ie中可以使用text-overflow:ellipsis了,但有很多的浏览器都需要固定宽度了,同时ff这些浏览器并不支持text-overflow:ellipsis设置了,下文来给各位整理一 ...