终于把Aprior的算法过程看懂了,Aprior算法的原理其实很简单,但是当真正写起代码来还是比较麻烦,在百度文库了,下了一个C++版的Aprior算法,用来研究。
算法思想:1,先对样本数据,用二维数组保存。2,找一元频繁集,先遍历一下样本数组,保存成一列的形式cur[n][],然后再扫描那一列,提取不重复元素保存起来curL1[][],再次遍历样本列,把每个不重复元素的个数记录下来,也就是CountL1[],3找二元频繁集,for循环数组,对每一行分析:对其中元素进行排列组成成2元形式,进行保存cur[n][],提取不重复元素保存起来curL2[][],再次遍历样本列,把每个不重复元素的个数记录下来,也就是CountL2[],3,三元,四元类似分析.....4,关联规则:先是通过支持度删选,对于已经满足条件的三元数据进行分析,对三元数据求其真子集,然后对子集中长度为1,和长度为2的组合求其置信率;5,最后对其进行筛选。
算法源码:(参考别人的代码)
//支持度不小于2,置信度不小于0.8
#include "stdio.h"
#include "iostream.h"
#include "string.h"
//定义全局变量
char curL1[20][2];//实现出现的一维子集
int countL1[10];//找到各一维频繁子集出现的次数。
char curL2[20][3]; //出现的二维子集
int countL2[10]; //各二维频繁子集出现的次数
char curL3[20][4]; //出现的三维子集
int countL3[10]; //各三维频繁子集出现的次数
char cur[50][4];//临时二维数组,用于保存中间产生的变量
//定义int SizeStr(char* m) 得到字符串的长度。实现代码如下:
int SizeStr(char* m)
{
int i=0;
while(*(m+i)!=0)
{
i++;
}
return i;
}
//比较两个字符串,如果相等返回true,否则返回false
bool OpD(char* x,char* y)
{
int i=0;
if(SizeStr(x)==SizeStr(y))
{
while(*(x+i)==*(y+i))
{
i++;
if(*(x+i)==0 && *(y+i)==0)
return true;
}
}
return false;
}
//通过void LoadItemL1(char **p) 得到所有1元的字串和各自出现的次数
void LoadItemL1(char **p)//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++)
{
curL1[i][0]=0;
curL1[i][1]=0;
}
for(j=0;j<10;j++)
countL1[j]=0;
//将样本数组中的数值提取出来,保存在cur[n][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;
//printf