Apriori使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。 首先,通过扫描数据库,累计每个项的计数,并收集满足最小支持度的项,找出频繁1项集的集合。该集合记作L1。然后,L1用于找频繁2项集的集合L2,L2用于找L3,如此下去直到不能再找到频繁k项集。找每个Lk需要一次数据库全扫描。

Apriori定律1 :如果某商品组合小于最小支持度,则就将它舍去,它的超集必然不是频繁项集。
Apriori定律2 :如果一个集合是频繁项集,即这个商品组合支持度大于最小支持度,则它的所有子集都是频繁

数据库有5个事务。设min_sup=60%,min_conf=80%

TID

购买的商品

T100

{M,O,N,K,E,Y}

T200

{D,O,N,K,E,Y}

T300

{M,A,K,E}

T400

{M,U,C,K,Y}

T500

{C,O,O,K,I,E}

在程序中,使用Apriori算法,找出频繁项集

步骤:

  1. 每个项都是候选1项集的集合C1的成员。算法扫描所有的事务,获得每个项,生成C1(见下文代码中的create_C1函数)。然后对每个项进行计数。然后根据最小支持度从C1中删除不满足的项,从而获得频繁1项集L1。
  2. 对L1的自身连接生成的集合执行剪枝策略产生候选2项集的集合C2,然后,扫描所有事务,对C2中每个项进行计数。同样的,根据最小支持度从C2中删除不满足的项,从而获得频繁2项集L2。
  3. 对L2的自身连接生成的集合执行剪枝策略产生候选3项集的集合C3,然后,扫描所有事务,对C3每个项进行计数。同样的,根据最小支持度从C3中删除不满足的项,从而获得频繁3项集L3。
  4. 以此类推,对Lk-1的自身连接生成的集合执行剪枝策略产生候选k项集Ck,然后,扫描所有事务,对Ck中的每个项进行计数。然后根据最小支持度从Ck中删除不满足的项,从而获得频繁k项集。
 vc代码:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define D 5 /*D数事务的个数*/
#define MinSupCount 3 /*最小事务支持度数*/
void main()
{
char a[5][6] = {{ 'M','O','N','K','E','Y' },{ 'D','O','N','K','E','Y' },{ 'M','A','K','E' },{ 'M','U','C','K','Y'},{ 'C','O','O','K','I','E' }};
char b[20], d[100], t, b2[100][10], b21[100][10];//b用来保存数据库中的元素
int i, j, k, x = 0, flag = 1, c[20] = { 0 }, x1 = 0, i1 = 0, j1, counter = 0, c1[100] = { 0 }, flag1 = 1, j2, u = 0, c2[100] = { 0 }, n[20], v = 1;
int count[100], temp;
for (i = 0; i<D; i++)
{for (j = 0; a[i][j] != '\0'; j++){
/*这个循环是用来判断之前保存的是否和a[i][j]一样,不一样就保存,一样就不保存*/for (k = 0; k<x; k++){if (b[k] != a[i][j]);//b[k]是已存储的项,已存储的项不等于现在存储的,意味着有新元素。else{flag = 0; break;}}/*这个if是用来判断是否相等*/if (flag == 1){b[x] = a[i][j];x++;}else flag = 1;/*这个不保存,那就跳到下一个数*/}
}
//数组b用于存放元素,即x就是元素种类的个数
/*计算筛选出的元素的支持度计数*/
for (i = 0; i<D; i++)
{for (j = 0; a[i][j] != '\0'; j++){for (k = 0; k<x; k++)/*这个x是上面b数组中元素个数,用b数组和a[i][j]数组中的每一行和每一列进行比较,用来记录b数组每一个元素的支持度计数*/{if (a[i][j] == b[k]){c[k]++; break;}}}
}
//数组c用于存放每个元素的支持度计数
for (k = 0; k<x; k++){if (c[k] >= MinSupCount){d[x1] = b[k];count[x1] = c[k];x1++;//L1中元素的个数}}
//数组D即为L1
/*对选出的项集中的元素进行排序*/
for (i = 0; i<x1 - 1; i++)
{for (j = 0; j<x1 - i - 1; j++){if (d[j]>d[j + 1]){t = d[j]; d[j] = d[j + 1]; d[j + 1] = t;temp = count[j]; count[j] = count[j + 1];      count[j + 1] = temp;}}
}
/*打印出L1*/
printf("L1 elements are:\n");
for (i = 0; i<x1; i++)
{printf("{%c} = %d  ", d[i], count[i]);
}
printf("\n");/*计算事务的项的个数,并且保存到n[]数组中*/
for (i = 0; i<D; i++)
{
for (j = 0; a[i][j] != '\0'; j++);
n[i] = j;
}
//数组n表示各事务中的元素个数
/*对a[][]数组的每一行进行排序*///对本例没影响,因为已经排好了序
for (i = 0; i<D; i++)
{for (j = 0; j<n[i] - 1; j++){for (k = 0; k<n[i] - j - 1; k++){if (a[i][k]>a[i][k + 1]){t = a[i][k];a[i][k] = a[i][k + 1];a[i][k + 1] = t;}}}
}
/*把L1中的每一个元素都放在b2[i][0]中*/
j1 = x1;//j1初始设置为L1中元素的个数。
for (i = 0; i<j1; i++)
{
b2[i][0] = d[i];
}
/*把L1中的元素进行组合,K=2开始,表示x1个元素选K个元素的组合(x1是频繁一项集个数)*/
for (k = 2; b2[0][0] != '\0'; k++)
{   /*u是用来计数候选集中的组合总数的*/u = 0; v = 1;/*v 是用来在进行输出各种组合的标识数 v=1 说明正在进行输出*/for (i = 0; i<100; i++){c2[i] = 0;//频繁项集Lk中元素的支持度计数}for (i = 0; i<j1; i++)//j1是Lk-1中的集合个数,初始为L1中的集合个数x1{for (i1 = i + 1; i1<j1; i1++){for (j = 0; j<k - 2; j++){//k-2之前只要有不同的,说明不能链接,标记flag1为0if (b2[i][j] != b2[i1][j]){flag1 = 0; break;}}
/*进行组合的部分*/
if (flag1 == 1 && b2[i][k - 2] != b2[i1][k - 2])//可以链接并且最后一个元素不相等
{for (j2 = 0; j2<k - 1; j2++){b21[u][j2] = b2[i][j2];   //k-1个元素保持不变}b21[u][k - 1] = b2[i1][k - 2]; //第k个元素加上不同的那个u++;}flag1 = 1;}
}
//b21为候选集
counter = 0;//候选k项集中的元素在某个事务中出现的次数
for (i = 0; i<D; i++)/*找候选项集Ck中满足支持度计数的*///扫描D
{for (i1 = 0; i1<u; i1++)/*U=Ck中所有组合总数*/{for (j1 = 0; j1<k; j1++)/*K 代表一个组合中的元素个数*/{for (j = 0; a[i][j] != '\0'; j++)/*逐个比较每一行的元素*/{if (b21[i1][j1] == a[i][j]){counter++;break;}}}if (counter == k) c2[i1]++;
/*把候选集是事务的子集的计数记录在c2数组中(只要满足有k个元素在某个事务中,则计数加1)*/
counter = 0;}
}
j1 = 0; temp = 0;/*这里的temp 是用来分行*//*对u种情况进行选择,选出支持度计数大于2的*/
//j1对Lk中的集合个数计数,每次在输出前重置。
for (i = 0; i<u; i++)
{if (c2[i] >= MinSupCount){if (v == 1){printf("L%d elements are:\n", k);v = 0;}printf("{");for (j = 0; j<k; j++)/*输出每种组合k 个元素*/{b2[j1][j] = b21[i][j];printf("%c,", b2[j1][j]);}j1++; //Lk计数加1printf("\b}");printf(" = %d  ", c2[i]);if (0 == (temp + 1) % 3) //printf("\n");temp++;}
}b2[j1][0] = '\0';//j1是Lk中的集合个数
if (b2[0][0] != '\0')
printf("\b \n");
}system("pause");
}

Apriori算法的实现相关推荐

  1. 关联规则挖掘Apriori算法的实现

    实验名称 关联规则挖掘Apriori算法的实现 实验目的 1.掌握频繁项目集的生成原理 2.掌握关联规则挖掘的原理 3.掌握在weka中进行关联规则挖掘的具体流程. 实验内容 1.根据给定的事务数据库 ...

  2. Apriori算法和FP-Tree算法简介

    Apriori关联分析算法 Apriori 算法是挖掘产生关联规则所需频繁项集的基本算法,也是最著名的关联分析算法之一. 1. Apriori 算法 Apriori 算法使用了逐层搜索的迭代方法,即用 ...

  3. 计算机图形学 区域填充,计算机图形学 区域填充算法的实现

    . '. 实验四区域填充算法的实现班级 08信计学号 58 姓名陈瑞雪分数 一.实验目的和要求: 1.掌握区域填充算法基本知识 2.理解区域的表示和类型,能正确区分四连通和八连通的区域 3.了解区域填 ...

  4. OpenCV中图像旋转(warpAffine)算法的实现过程

    在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...

  5. JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现

    <实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...

  6. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  7. 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用

    交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方平方差(Mean Squared Er ...

  8. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  9. 选择性模糊及其算法的实现。

    选择性模糊及其算法的实现. 我们常见的模糊算法比如均值模糊.高斯模糊等其基本的过程都是计算一个像素周边的的某个领域内,相关像素的某个特征值的累加和及对应的权重,然后得到结果值.比如均值模糊的各像素的权 ...

最新文章

  1. 浅析C语言的一个关键字——register
  2. 倒计时一天 坚果智能影院让家用投影投出你的新生活主义
  3. 利用VSPD、串口调试助手、Keil做串口调试
  4. php array in array,浅谈PHP array_search 和 in_array 函数效率问题
  5. element-ui cascader 级联选择器 存最后一级id及回显
  6. exec go 重启_无停机优雅重启 Go 程序
  7. UPSNet论文笔记
  8. 活动推荐|互联网3.0与区块链新时代论坛(北京)
  9. HDU-2082 找单词 母函数
  10. Flutter - 微信朋友圈效果实现
  11. 企业微信网页应用开发 - 开发环境搭建
  12. 盘点——iOS应用开发常用工具
  13. 面试产品经理 应该如何介绍自己的优势和劣势?
  14. MacOS 开发 - isFlipped(坐标系)
  15. STM32H743 USART1 LL 库
  16. 六星经典CSAPP笔记(2)信息的操作和表示
  17. 【水位预测】基于matlab径向基神经网络地下水位预测【含Matlab源码 1939期】
  18. API服务平台,实现多个API的编排与聚合
  19. (亲测有效)荣耀手机一键激活Xposed框架方法
  20. Python - openpyxl Excel 操作示例与实践

热门文章

  1. 计算机网络社会政策环境,计算机网络设备项目申请报告范文
  2. CRC校验matlab源码
  3. 用户贷款风险预测-datacastle竞赛题目
  4. html5 video 实现浅析,HTML5 Video 实现浅析
  5. 华为5G手机发布!5G和AI给世界带来什么?
  6. 大数斐波那契数列+取余
  7. 遭遇PSW Win32 WoWar Trojan Win32 MnLess Trojan IMMSG Win32 TBM
  8. 第三组(geomystory)需求经理:头脑风暴+核心竞争力+功能集+NABCD+用例文档+功能说明书+技术说明书...
  9. MySQL对身份证号、手机号等敏感信息用****加密
  10. 如何解决:使用zotero引用文献时进入word时出现报错-error: citation/ bibliography is wrongly placed in index area