1、0805030115 梅超亮 数据挖掘 Apriori算法武 汉 工 程 大 学计算机科学与工程学院数据挖掘与知识发现实验报告专业班级08智能1班实验地点计算机大楼419学生学号0805030115指导教师吕品学生姓名梅超亮实验时间2011-12-19实验项目实验2 经典数据挖掘算法的实现实验类别操作性() 验证性() 设计性() 综合性( ) 其它( )实验目的及要求1.进一步熟悉高级语言编程;2掌握使用Apriori算法从事物数据库中挖掘频繁项集的方法;掌握使用ID3算法对任意元组进行分类;掌握使用k-means算法给每一类帖上标签;3.任选其中一个算法实现.成 绩 评 定 表类 别评 分
2、 标 准分值得分合 计上机表现积极出勤、遵守纪律主动完成实验设计任务30分程序代码比较规范、基本正确功能达到实验要求30分实验报告及时递交、填写规范内容完整、体现收获40分说明: 评阅教师: 日 期: 2011 年 月 日实 验 内 容1. 算法思想(1) 首先遍历一次数据库,得到所有单元素的 最后的总结果:2源程序使用的数据结构结构体 Shop用来记录每个商店所拥有的商品名、该商店名struct Shop char TID5; /商店Id char Goods5; /该商店所有的商品名AllElectronics9;结构体GoodNode记录链表的节点。每个节点有以下内容:商品名、该节点的支
3、持度、下一个节点的地址。struct GoodNode char Goods10; int sup; struct GoodNode *next;结构体slistGoodV表示的是候选项目集的链表struct slistGoodV struct GoodNode *head; struct GoodNode *tail; int len;TALL;3源程序#include #include #include struct Shop char TID5; char Goods5;AllElectronics9;struct GoodNode char Goods10; int sup; stru
4、ct GoodNode *next;struct slistGoodV struct GoodNode *head; struct GoodNode *tail; int len;TALL;向候选项目集的链表中的尾部插入节点newnodestruct GoodNode *AddTail(struct GoodNode *newnode) if(TALL.len = 0) TALL.head = newnode; TALL.tail = newnode; TALL.head-next = NULL; TALL.tail-next = NULL; else TALL.tail-next = new
5、node; TALL.tail-next-next = NULL; TALL.tail = newnode; TALL.len+; return TALL.head;产生第一个链表void ProduceListA() char tmp10; struct GoodNode *tem; struct GoodNode *flag, *flag2,*tail; flag = TALL.head; tail = TALL.tail; while(flag != tail) flag2 = flag-next; while(flag2 != tail) memset(tmp,0,10); strcp
6、y(tmp,flag-Goods); strcat(tmp,flag2-Goods); tem = (struct GoodNode *)malloc(sizeof(struct GoodNode); strcpy(tem-Goods,tmp); tem-sup = 0; AddTail(tem); flag2 = flag2-next; memset(tmp,0,10); strcpy(tmp,flag-Goods); strcat(tmp,flag2-Goods); tem = (struct GoodNode *)malloc(sizeof(struct GoodNode); strcp
7、y(tem-Goods,tmp); tem-sup = 0; AddTail(tem); flag = flag-next; flag = TALL.head; while(flag-sup != 0) TALL.head = TALL.head-next; free(flag); flag = TALL.head; 在前一个链表基础上产生下一个链表void ProduceListB() char tmp10; struct GoodNode *tem; struct GoodNode *flag, *flag2,*tail; flag = TALL.head; tail = TALL.tai
8、l; while(flag != tail) flag2 = flag-next; while(flag2 != tail) if(flag-Goods0 != flag2-Goods0) break; memset(tmp,0,10); strcpy(tmp,flag-Goods); tmp2 = flag2-Goods1; tmp3 = 0; tem = (struct GoodNode *)malloc(sizeof(struct GoodNode); strcpy(tem-Goods,tmp); tem-sup = 0; AddTail(tem); flag2 = flag2-next
9、; if(flag-Goods0 = flag2-Goods0) memset(tmp,0,10); strcpy(tmp,flag-Goods); tmp2 = flag2-Goods1; tmp3 = 0; tem = (struct GoodNode *)malloc(sizeof(struct GoodNode); strcpy(tem-Goods,tmp); tem-sup = 0; AddTail(tem); flag = flag-next; flag = TALL.head; while(flag-sup != 0) TALL.head = TALL.head-next; fr
10、ee(flag); flag = TALL.head; 判断链表中的节点的商品名是否在某个商店中int IfInItem(struct Shop *shop,struct GoodNode *node) int i = 0; int k = 0; int flag = 0; while(node-Goodsi != 0) k = 0; flag = 0; while(shop-Goodsk != 0) if(node-Goodsi = shop-Goodsk) flag = 1; break; k+; if(flag = 0) return 0; i+; return 1;计算链表中每个节点的
11、支持度void AddSup() struct GoodNode *tmp; tmp = TALL.head; int i = 0; int j; while(tmp != NULL) for(j = 0; j sup+; tmp = tmp-next; 删除链表中的节点void DeleteNode(int k) / k为支持度 struct GoodNode *tmp, *tmp2; tmp = TALL.head; while(tmp-next != NULL) if(tmp-next-sup next; tmp-next = tmp2-next; free(tmp2); else tm
12、p = tmp-next; TALL.len-; if(TALL.head -sup next; free(tmp); TALL.len-; bool JudgeSame(char *temp) struct GoodNode *tmp; tmp = TALL.head; while(tmp != NULL) while(strcmp(tmp-Goods,temp) = 0) tmp-sup+; return true; tmp = tmp-next; return false;打印链表void ProduceList() int i; int j; int k = 0; char tmp10
13、; struct GoodNode *tem; for(i = 0; i 9; i+) for(j = 0; j Goods,tmp); tem-sup = 0; AddTail(tem); void printTall() struct GoodNode *tmp; tmp = TALL.head; while(tmp != NULL) printf(%st%dn,tmp-Goods,tmp-sup); tmp = tmp-next; 初始化商店的商品信息void InitShop() strcpy(AllElectronics0.TID, T100); strcpy(AllElectron
14、ics0.Goods,ABE); strcpy(AllElectronics1.TID, T200); strcpy(AllElectronics1.Goods,BD); strcpy(AllElectronics2.TID, T300); strcpy(AllElectronics2.Goods,BC); strcpy(AllElectronics3.TID, T400); strcpy(AllElectronics3.Goods,ABD); strcpy(AllElectronics4.TID, T500); strcpy(AllElectronics4.Goods,AC); strcpy
15、(AllElectronics5.TID, T600); strcpy(AllElectronics5.Goods,BC); strcpy(AllElectronics6.TID, T700); strcpy(AllElectronics6.Goods,AC); strcpy(AllElectronics7.TID, T800); strcpy(AllElectronics7.Goods,ABCE); strcpy(AllElectronics8.TID, T900); strcpy(AllElectronics8.Goods,ABC);int main() TALL.head = NULL;
16、 TALL.tail = NULL; TALL.len = 0; InitShop(); int i,j = 0; printf(商店信息n); printf(商店名t商品n); for(i = 0; i 9; i+) printf(%st,AllElectronicsi.TID); printf(%st,AllElectronicsi.Goods); printf(n); printf(第一次产生频繁项集n); printf(项集t支持度n); ProduceList(); printTall(); printf(剔除支持度小于n); DeleteNode(2); printTall();
17、printf(第二次产生频繁项集n); printf(项集t支持度n); ProduceListA(); AddSup(); printTall(); printf(第三次产生频繁项集n); printf(项集t支持度n); ProduceListB(); AddSup(); printTall(); return 0; 实 验 总 结在这次实验中的难点是:关联规则挖掘的第二阶段产生关联规则(Association Rules)。从高频项目组产生关联规则,是利用前一步骤的高频k-项目组来产生规则,在最小信赖度(Minimum Confidence)的条件门槛下,经由高频k-项目组A,B所产生的规则AB,其信赖度可经由公式求得,若数据结构设置的不好,后面的计算量将不是局部的改变,而是伴随后面所有的候选项目集。所以我的想法是纵方向设置一个项目集链表,横方向是字符串型的数组。后面的项目集有前一个的候选项目集产生,所以链表会不断变化,最后就得出了大项目集。 这次实验花费了很长时间,也学到了很多知识,很感谢吕品老师的悉心指导和同学们的热情帮助,让我按时完成了这次实验。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2