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都是频繁的。所以如果判断得到相同位置项集相同才会连接。

时间: 2024-10-10 14:31:08

Apriori算法—C语言实现的相关文章

R语言之Apriori算法应用

一. 概念 关联分析用于发现隐藏在大型数据集中的有意义的联系.所发现的联系可以用关联规则(association rule)或频繁项集的形式表示. 项集:在关联分析中,包含0个或多个项的集合被称为项集(itemset).如果一个项集包含k个项,则称它为k-项集.例如:{啤酒,尿布,牛奶,花生} 是一个4-项集.空集是指不包含任何项的项集. 关联规则(association rule):是形如 X → Y 的蕴含表达式,其中X和Y是不相交的项集,即:X∩Y=∅.关联规则的强度可以用它的支持度(su

玩转大数据:深入浅出大数据挖掘技术(Apriori算法、Tanagra工具、决策树)

一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 “大数据”作为时下最火热的IT行业的词汇,随之而来的数据仓库.数据分析.数据挖掘等等围绕大数据的商业价值的利用逐渐成为行业人士争相追捧的利润焦点. “大数据” 其实离我们的生活并不遥远,大到微博的海量用户信息,小到一个小区超市的月销售清单,都蕴含着大量潜在的商业价值. 正是由于数据量的快速增长,并且已经远远超过了人们的数据分析能力.因此,科学.商用等领域都迫切需要智能化.自动化的数据分析工具.在这样的背景下,数据挖掘技术应用而生,使得

机器学习(八)—Apriori算法

摘要:本文对Apriori算法进行了简单介绍,并通过Python进行实现,进而结合UCI数据库中的肋形蘑菇数据集对算法进行验证. “啤酒与尿布”的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起.但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了.这可不是一个笑话,而是一直被商家所津津乐道的发生在美国沃尔玛连锁超市的真实案例.原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫

Apriori算法--关联规则挖掘

我的数据挖掘算法代码:https://github.com/linyiqun/DataMiningAlgorithm 介绍 Apriori算法是一个经典的数据挖掘算法,Apriori的单词的意思是"先验的",说明这个算法是具有先验性质的,就是说要通过上一次的结果推导出下一次的结果,这个如何体现将会在下面的分析中会慢慢的体现出来.Apriori算法的用处是挖掘频繁项集的,频繁项集粗俗的理解就是找出经常出现的组合,然后根据这些组合最终推出我们的关联规则. Apriori算法原理 Aprio

机器学习实战精读--------Apriori算法

关联分析(关联规则学习):从大规模数据集中寻找物品间的隐含关系, Apriori算法:一种挖掘关联规则的频繁项算法,其核心是通过候选集生成和情节的向下封闭检测ll阶段来挖掘频繁项集,它是最具影响的挖掘布尔关联规则频繁集的算法 Aprior算法缺点:① 可能产生大量候选集:② 可能需要重复扫描数据库. 频繁项集:经常出现在一块的物品的集合 关联规则:暗示两种物品之间可能存在很强的关系 一个项集的支持度:数据集中包含该项集的记录所占的比例:支持度是针对项集来说的. 可信度(置信度):针对一条诸如{尿

Apriori算法

APRIORI Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集.而且算法已经被广泛的应用到商业.网络安全等各个领域. Apriori算法 是一种最有影响的挖掘布尔关联规则频繁项集的算法.其核心是基于两阶段频集思想的递推算法.该关联规则在分类上属于单维.单层.布尔关联规则.在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集. 算法思想 该算法的基本思想[2]  是:首先找出所有的频集,这些项集出现的频繁性至少和预定

关联规则挖掘(基本概念和Apriori算法)

关联规则挖掘的研究一直是数据挖掘领域的一个重要方向. 关联规则挖掘的目的是从大型事务数据库中挖掘出不同项目之间的关联关系 ,找出潜在的行为模式. 关联规则概念是由 Agrawal 等人在1993年率先提出的, 并随后提出了Apriori算法. 基本概念: 定义1  关联规则挖掘的事务数据库记为TDB,TDB={T1,T2,…,Tk},Tk={i1,i2,…,ip},Tk称为事务,ip称为项目. 定义2  设I={i1,i2,…,im}是TDB中全体项目组成的集合.每一个事务T是I中一组项目的集合

频繁模式挖掘-Apriori算法

DM实验,写的比较二,好多情况还没有考虑,后续有时间会修改. 开始的时候数据结构没设计好导致写到后面费了很大的劲.不过还好python的列表有起死回生的功效... 数据集:database.txt I1,I2,I5 I2,I4 I2,I3 I1,I2,I4 I1,I3 I2,I3 I1,I3 I1,I2,I3,I5 I1,I2,I3 apriori.py #coding=utf-8 """ author:messiandzcy apriori.py date:2014.12.

Apriori算法关联分析与pyhon实现

算法中核心性质:频繁项集的所有非空子集也必须是频繁的.逆反命题 也成立:如果一个项集是非频繁的,那么所有它的超集也是非频繁. 一.Apriori算法简介:  Apriori算法是一种挖掘关联规则的频繁项集算法,其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集. Apriori(先验的,推测的)算法应用广泛,可用于消费市场价格分析,猜测顾客的消费习惯:网络安全领域中的入侵检测技术:可用在用于高校管理中,根据挖掘规则可以有效地辅助学校管理部门有针对性的开展贫困助学工作:也可用在移