Apriori算法的C/C#实现
来源:互联网 发布:php 获取主域名 编辑:程序博客网 时间:2024/05/18 01:14
Apriori算法的C/C#实现
最近研究Web数据挖掘常用算法。主要参考书是:
web数据挖掘/刘兵http://book.360buy.com/10079869.html
数据结构/严蔚敏
c语言程序设计/谭浩强
对于c#实现参考
http://www.codeproject.com/Articles/70371/Apriori-Algorithm
c语言实现部分
我把程序发到了csdn
http://download.csdn.net/detail/jiezou007/4458407
数据结构的选取,还做得不太好,会继续改进,请大牛多多指点。
之后我会比较C#与C的Apriori程序,总结一些区别,谈谈面向对象编程在这个算法上的体现与数据结构的选择问题。
#include <dos.h> #include <conio.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #define ItemNumSize 2 #define TranNumSize 100 #define LISTINCREMENT 1 #define OK 1 #define TRUE 1 #define FASLE 0 #define ERROR 0 #define MAX_ARRAY_DIM 100 #define MAXSIZE 100 typedef char ItemType; typedef int ElemType; float minSupport,minConfidence; //动态内存分配,item用什么数据结构 动态数组,线性表好:数组是整体创建,整体删除的 typedef struct { ItemType *item;//项目 int length;//当前项目个数 int listsize;//当前分配的存储容量 }SqList; //事务数组集合 typedef struct { SqList r[MAXSIZE+1]; int Length; }TranList; //初始化项目的线性表 int InitListSq(SqList &L) { L.item=(ItemType * )malloc(ItemNumSize *sizeof(ItemType)); if (!L.item)exit(OVERFLOW);//存储分配失败 L.length=0;//空表长度为0 L.listsize=ItemNumSize;//初始化存储容量 return OK; } //初始化事务的线性表 int InitListTran(TranList &TranL)//还有更好的动态分配方式初始化 { for (int i=1;i<=TranNumSize;i++) { InitListSq(TranL.r[i]); } return OK; } //插入项目线性表 int listInsertSq(SqList &L,int i,ItemType e) { //在线性表L中第i个位置之前插入新元素e //i的合法值为1<=i<=l.listlength+1 ItemType *newbase,*q,*p; if(i<1||i>L.length+1)return ERROR;//i值不合法 if (L.length>=L.listsize)//当前存储空间已满,添加分配 { //重新分配内存空间 newbase=(ItemType *)realloc(L.item,(L.listsize+LISTINCREMENT)*sizeof(ItemType)); if (!newbase)exit(OVERFLOW); L.item=newbase;//新基址 L.listsize+=LISTINCREMENT;//增加存储容量 } q=&(L.item[i-1]);//q为插入位置 for(p=&(L.item[L.length-1]);p>=q;--p) *(p+1)=*p;//插入位置,及之后的元素右移 *q=e; ++L.length; return OK; } void main() { int c; ItemType e; SqList L; int sn; int ItemNum; //项目个数 int trannum[20]={0}; //事务数量 char b2[100][10]; char b21[100][10]; TranList TranL; SqList L1; InitListSq(L); InitListTran(TranL); printf ("链表长度:%d\n", L.length); // 线性表当前的元素个数 printf ("链表大小:%d\n", L.listsize); // 线性表最多可存放元素的个数 while (1) { system("cls"); printf_s("\n Apriori算法的C语言实现\n"); printf_s(" 1 输入项目集合\n"); printf_s(" 2 添加事务\n"); printf_s(" 3 设定最小支持度与最小置信度\n"); printf_s(" 4 输出结果\n"); printf_s(" 5 退出\n"); printf_s("请输入:\n"); scanf_s("%d",&c); switch (c) { case 1://构造项目集 { int it; char ItemValue; system("cls"); printf_s("构造项目集\n"); printf_s("请输入项目个数:\n");//项目个数 scanf_s("%d",&ItemNum); for (it=1;it<=ItemNum;it++)//依次输入每个项目集 { fflush(stdin); printf_s("\n请输入第%d个项目的字母(a,b,c,d,e,f,……):\n",it); scanf("%c",&ItemValue); listInsertSq(L,it,ItemValue); } printf_s("\n初始化后,项目集各元素值:\n"); for (int i=0;i<L.length;i++) { printf_s("%c\n",L.item[i]); } _getch(); break; } case 2: { system("cls"); //事务的数据结构,动态数组 int i,j; char tranvalue; printf_s("请输入要添加的事务个数:\n");//事务个数 scanf_s("%d",&sn); for (i=1;i<=sn;i++)//依次输入每个事务所包含的项目,i应当从0开始 { printf_s("请输入第%d个事务包含的项目数:",i); scanf_s("%d",&trannum[i]); fflush(stdin); for (j=1;j<=trannum[i];j++) { fflush(stdin); printf_s("输入事务的第%d个项目:\n",j); scanf_s("%c",&tranvalue); //动态分配内存,插入事务数组集合 listInsertSq(TranL.r[i],j,tranvalue); } } printf_s("\n各事务的项目如下:\n"); for (i=1;i<=sn;i++) { printf_s("\n第%d个事务\n",i); for (j=0;j<=trannum[i];j++) { printf_s("%c",TranL.r[i].item[j]); } } _getch(); break; } case 3://设定最小支持度与最小置信度 { system("cls"); printf_s("请输入最小支持度与最小置信度(空格隔开):"); fflush(stdin);//最好在每个scanf前加上fflush( stdin ); scanf_s("%f%f",&minSupport,&minConfidence); printf_s("\n最小支持度为:%2.2f\n",minSupport); printf_s("最小置信度为:%2.2f\n",minConfidence); _getch(); break; } case 4://Apriori算法 { InitListSq(L1); char generatedCandidate[10]; int c[20]={0}; int f[20]={0}; int jj=1; //得到C1,算法第一行 for (int i=0;i<ItemNum;i++)//算法太复杂了,以后改为二叉树 { for (int j=1;trannum[j]!=0;j++) { for (int k=0;TranL.r[j].item[k]!=0;k++) { if (L.item[i]==TranL.r[j].item[k]) { c[i]++; } } } //计算F1支持度 if (c[i]>=minSupport*trannum[i+1])//两个整数相除得到整数 { f[i]=c[i]; listInsertSq(L1,jj,L.item[i]);//L1 jj++; } } printf_s("F1集合为:\n"); int temp1=0; for (int i=0;i<ItemNum;i++) { printf_s("{%c}=%d ",L.item[i],f[i]); if ((temp1+1)%3==0) printf_s("\n"); temp1++; } printf_s("\n"); //排序TranL.r[j].item[k] int t; for (int i=1;i<=sn;i++)//每个事务 { for (int j=0;j<trannum[j+1];j++)//每个项目 { if (TranL.r[i].item[j]>TranL.r[i].item[j+1]) { t=TranL.r[i].item[j]; TranL.r[i].item[j]=TranL.r[i].item[j+1]; TranL.r[i].item[j]=t; } } } //GenerateCandidates函数 int j1; j1=L1.length; //把L1->b2[i][] for (int i=0;i<j1;i++) { b2[i][0]=L1.item[i]; } int kk=0; for (int i=0;i<L1.length;i++) { generatedCandidate[kk]=L1.item[i]; kk++; for (int j=i+1;j<L1.length;j++) { generatedCandidate[kk]=L1.item[i+1]; if (generatedCandidate!=0) { char temp; //排序 for (int i=0;generatedCandidate[i+1]!=0;i++) { if (generatedCandidate[i]>generatedCandidate[i+1]) { temp=generatedCandidate[i]; generatedCandidate[i]=generatedCandidate[i+1]; generatedCandidate[i+1]=temp; } } } } } int u=0; int v=1;//用V来进行输出各种组合的标识数V=1表示正在进行输出 int c2[100]={0}; int flag1=1; int counter=0; int temp; //getsupport for (int k=2;b2[0][0]!='\0';k++) { u=0;v=1; for (int i=0;i<100;i++) { c2[i]=0; } for (int i=0;i<j1;i++) { for (int i1=i+1;i1<j1;i1++) { for (int j=0;j<k-2;j++) { if (b2[i][j]!=b2[i1][j]) { flag1=0; break; } } //进行组合的部分 if (flag1==1&&b2[i][k-2]!=b2[i1][k-2]) { for (int j2=0;j2<k-1;j2++) { b21[u][j2]=b2[i][j2]; } b21[u][k-1]=b2[i1][k-2]; u++; } flag1=1; } } counter=0; for (int i=0;i<sn;i++) { for (int i1=0;i1<u;i1++) { for (int j1=0;j1<k;j1++) { for (int j=0;TranL.r[i+1].item[j]!='\0';j++) { if (TranL.r[i+1].item[j]==b21[i1][j1]) counter++; } } if (counter==k) c2[i1]++; counter=0; } } j1=0; temp=0; //对U中情况进行选择,选出支持度计数大于2的 for (int i=0;i<u;i++) { if (c2[i]>=minSupport) { if (v==1) { printf_s("\nF%d集合为:\n",k); v=0; } printf_s("{"); for (int j=0;j<k;j++) { b2[j1][j]=b21[i][j]; printf_s("%c,",b2[j1][j]); } j1++; printf_s("\b}"); printf_s("=%d ",c2[i]); if ((temp+1)%3==0) printf_s("\n"); temp++; } } b2[j1][0]='\0'; if (b2[0][0]!='0') { printf_s("\b \n"); } } _getch(); break; } case 5: { return; _getch(); system("cls"); break; } default: { printf_s("输入有误请重新输入!\n"); _getch(); system("cls"); } } } }
- Apriori算法的C/C#实现
- Apriori算法(c++/c#语言实现)
- Apriori算法的实现
- Apriori算法的Python实现!
- Apriori算法的实现二
- Apriori算法的实现三
- Apriori 算法 java 的实现
- Apriori算法的C++实现
- Apriori算法的Python实现
- Apriori算法的python实现
- Apriori算法的java实现
- Apriori算法的JAVA实现
- Apriori算法的Java实现
- Apriori算法的python实现
- Apriori算法的C++实现
- 用C#实现Apriori算法(文档)
- C#实现Apriori算法(源代码)
- 分析apriori 算法的 trie实现
- NET环境下水晶报表使用总结
- JS操作iframe
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- Java绘图机制
- Android 菜单(OptionMenu)大全 建立你自己的菜单
- Apriori算法的C/C#实现
- Asp.net mvc 在使用 jquery ajax Delete 时 404 Not found
- 晶振
- Asp.Net中使用水晶报表
- 使用VM Workstation8 创建共享磁盘
- 演化理解Android异步加载图片
- 编译android版本的opencv 2.4.2
- C++网页抓取
- shell进程前后台转换