叶志伟数据挖掘实验指导书(算法编程部分)_第1页
叶志伟数据挖掘实验指导书(算法编程部分)_第2页
叶志伟数据挖掘实验指导书(算法编程部分)_第3页
叶志伟数据挖掘实验指导书(算法编程部分)_第4页
叶志伟数据挖掘实验指导书(算法编程部分)_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据挖掘与数据仓库实验指导书2013年 计算机学院计算应用实验1 Apriori算法实现一、实验目的1、掌握Apriori算法对于关联规则挖掘中频繁集的产生以及关联规则集合的产生过程;2、根据算法描述编程实现算法,调试运行。并结合相关实验数据进行应用,得到分析结果。数据和删除数据的操作。实验类型:综合计划课间:2学时二、实验内容1、频繁项集的生成与Apriori算法实现;2、关联规则的生成过程与Rule-generate算法实现;3、结合样例对算法进行分析;三、实验步骤编写程序完成下列算法:1、Apriori算法输入: 数据集D;最小支持数minsup_count;输出: 频繁项目集LL1=l

2、arge 1-itemsetsFor (k=2; Lk-1; k+)Ck=apriori-gen (Lk-1); / Ck是k个元素的候选集For all transactions tD do begin Ct=subset(Ck,t); /Ct是所有t包含的候选集元素 for all candidates c Ct do c.count+; endLk=c Ck| c.count minsup_count EndL=Lk;2、apriori-gen (Lk-1) 候选集产生算法输入: (k-1)-频繁项目集Lk-1输出: k-频繁项目集CkFor all itemset pLk-1 doFo

3、r all itemset qLk-1 doIf p.item1=q.item1, p.item2=q.item2, ,p.itemk-2=q.itemk-2, p.itemk-1<q.itemk-1 thenbegin c=pq if has_infrequent_subset(c, Lk-1) then delete c else add c to CkEndReturn Ck3、has_infrequent_subset(c, Lk-1)功能:判断候选集的元素输入: 一个k-频繁项目集Lk-1 ,(k-1)-频繁项目集Lk-1输出:c是否从候选集中删除的布尔判断For all (k

4、-1)-subsets of c doIf Not(SLk-1) THEN return TRUE;Return FALSE;4、Rule-generate(L,minconf)输入:频繁项目集;最小信任度输出:强关联规则算法:FOR each frequent itemset lk in L generules(lk,lk);5、Genrules递归算法:Genrules(lk:frequent k-itemset, xm:frequent m-itemset)X=(m-1)-itemsets xm-1 | xm-1 in xm;For each xm-1 in XBEGIN conf=su

5、pport(lk)/support(xm-1); IF (confminconf) THEN BEGIN 输出规则:xm-1->(lk-xm-1),support,confidence; IF (m-1)>1) THEN genrules(lk,xm-1); END;END;结合相关样例数据对算法进行调试,并根据相关实验结果对数据进行分析,四、实验报告要求1、用C语言或者其他语言实现上述相关算法。2、实验操作步骤和实验结果,实验中出现的问题和解决方法。五、注意事项1、集合的表示及相关操作的实现;2、项目集的数据结构描述;参考核心代码如下:(相关的测试main函数可以自己书写。根据频

6、繁k项集生成关联规则相对简单,只需要计算最小置信度即可从频繁K项集中找到所有的满足条件的关联规则。)/对事物进行第一次扫描,生成频繁一项集,并返回一项集中个数int init_pass(char *item,char tranlen_tlen,int len,char res_itemlen_tlen,float min_sup)float t_sup;int number=0;for(int i=0;i<len;i+)int count=0;for(int j=0;j<len_t;j+)for(int k=0;k<len;k+)if(itemi=tranjk)count+;

7、break;break;t_sup=count*1.0/len;if(t_sup>=min_sup)res_itemnumber+0=itemi;return number-1;/生成候选K项集,返回k项集中事物的个数int candidate_gen(char ktranlenk,char kktranlenk+1)char tempk,temp1k,ktempk+1;int number=0;for(int i=0;i<len;i+)strcpy(temp,ktrani);bool flag;for(j=i+1;j<len;j+)strcpy(temp1,ktrani);

8、for(int m=0;m<k;m+)if(m<k-1 && tempm=temp1m)|m=k-1)continue;flag=true;else flag=false;break;if(flag)if(tempk-1>temp1k-1)strcpy(ktemp,temp1);ktempk=tempk-1;elsestrcpy(ktemp,temp);ktempk=temp1k-1break;flag=judge(kemp,ktranlenk);if(flag=true)strcpy(kktrannumber+,ktemp);return number-1;

9、/判断子集是否在k项集中bool judge(char *srcstr,char desstrlenk)char tempk;int count=0;for(int i=0;i<k-1;i+)for(int j=0;j<i;j+)tempj=srcstrj;for(int j=i+1;j<k+1;j+)tempj=srcstrj;for(int p=0;p<len;p+)if(strcmp(temp,desstri)=0)count+;break;if(count=k-1)return true;return false;/apriori算法int apriori(ch

10、ar itemlen,char tranlengthlen,char res_tranlengthlen,float min_sup)char ttranlengthlen;int number,count,t_num;for(int i=0;i<length;i+)for(int j=0;j<len;j+)ttranij='0'number=init_pass(item,tranlengthlen,len,ttranlengthlen,min_sup);for(int i=0i<length;i+)res_trani0=ttrani0;for(int k=2

11、;number!=0;k+)t_num=number;number=candidate_gen(res_itemnumberk-1,ttrannumberk);if(k=2)continue;elsecount=0;for(int i=0;i<number;i+)char tempk;strcpy(temp,ttrani);bool t_flag=false;for(int j=0;j<length;j+)/求出候选K项集中每个事物的支持计数int t_k=0;for(int n=0;n<k;n+)bool m_flag=falsefor(int g=t_k;g<len

12、;g+)if(tempk=tranjg)m_flag=true;t_k=g;break;if(m_flag=true && n=k-1)t_flag=true;if(t_flag=true)count+;flag = false;if(count/length > min_sup)strcpy(res_itemi,temp);count=0;return t_num; 实验2-1 ID3算法实现一、实验目的通过编程实现决策树算法,信息增益的计算、数据子集划分、决策树的构建过程。加深对相关算法的理解过程。实验类型:综合计划课间:4学时二、实验内容1、分析决策树算法的实现流程

13、;2、分析信息增益的计算、数据子集划分、决策树的构建过程;3、根据算法描述编程实现算法,调试运行; 三、实验方法算法描述: 以代表训练样本的单个结点开始建树;若样本都在同一个类,则该结点成为树叶,并用该类标记;否则,算法使用信息增益作为启发信息,选择能够最好地将样本分类的属性;对测试属性的每个已知值,创建一个分支,并据此划分样本;算法使用同样的过程,递归形成每个划分上的样本决策树递归划分步骤,当下列条件之一成立时停止:给定结点的所有样本属于同一类;没有剩余属性可以进一步划分样本,在此情况下,采用多数表决进行四、实验步骤1、算法实现过程中需要使用的数据结构描述: Structint Attrib

14、_Col; / 当前节点对应属性int Value; / 对应边值Tree_Node* Left_Node; / 子树Tree_Node* Right_Node / 同层其他节点Boolean IsLeaf; / 是否叶子节点int ClassNo; / 对应分类标号Tree_Node;2、整体算法流程 主程序: InputData(); T=Build_ID3(Data,Record_No, Num_Attrib); OutputRule(T); 释放内存;3、相关子函数:3.1、 InputData()输入属性集大小Num_Attrib;输入样本数Num_Record;分配内存DataNu

15、m_RecordNum_Attrib;输入样本数据DataNum_RecordNum_Attrib;获取类别数C(从最后一列中得到);3.2、Build_ID3(Data,Record_No, Num_Attrib) Int Class_DistributeC; If (Record_No=0) return Null N=new tree_node(); 计算Data中各类的分布情况存入Class_Distribute Temp_Num_Attrib=0; For (i=0;i<Num_Attrib;i+) If (Data0i>=0) Temp_Num_Attrib+; If

16、Temp_Num_Attrib=0 N->ClassNo=最多的类; N->IsLeaf=TRUE; N->Left_Node=NULL;N->Right_Node=NULL; Return N;If Class_Distribute中仅一类的分布大于0 N->ClassNo=该类; N->IsLeaf=TRUE; N->Left_Node=NULL;N->Right_Node=NULL; Return N; InforGain=0;CurrentCol=-1;For i=0;i<Num_Attrib-1;i+) TempGain=Comp

17、ute_InforGain(Data,Record_No,I,Num_Attrib); If (InforGain<TempGain) InforGain=TempGain; CurrentCol=I;N->Attrib_Col=CurrentCol;/记录CurrentCol所对应的不同值放入DiferentValue;I=0;Value_No=-1;While i<Record_No Flag=false; For (k=0;k<Value_No;k+) if (DiferentValuk=DataiCurrentCol) flag=true; if (flag=f

18、alse)Value_No+;DiferentValueValue_No=DataiCurrentCol I+;SubData=以Data大小申请内存空间;For (i=0;i<Value_No;i+) k=-1; for (j=0;j<Record_No-1;j+) if (DatajCurrentCol=DiferentValui) k=k+;For(int i1=0;i1<Num_Attrib;i1+)If (i1<>CurrentCol)SubDataki1=Dataji1; Else SubDataki1=-1; N->Attrib_Col=Cur

19、rentCol; N->Value=DiferentValui; N->Isleaf=false; N->ClassNo=0; N->Left_Node=Build_ID3(SubData,k+1, Num_Attrib); N->Right_Node=new Tree_Node; N=N->Right_Node; 3.3、计算信息增益 Compute_InforGain(Data,Record_No, Col_No, Num_Attrib) Int DifferentValueMaxDifferentValue; Int Total_DifferentVa

20、lue; Int sClassNoMaxDifferentValue; s=0;/ 数组清0; Total_DifferentValue=-1; For (i=0;i<Record_No;i+) J=GetPosition(DifferentValue,Total_DifferentValue,DataiCol_no);If (j<0) Total_DifferentValue+;DifferentValueTotal_DifferentValue=DataiCol_no;J=Total_DifferentValue;SDataiNum_Attrib-1j+;Total_I=0;F

21、or (i=0;i<ClassNo;i+) Sum=0; For(j=0;j<Record_No;j+) if DatajNum_Attrib-1=i sum+; Total_I=Compute_PI(Sum/Record_No); EA=0;For (i=0;i<Total_DifferentValue;i+); temp=0;sj=0; /sj是数据子集中属于类j的样本个数; For (j=0;j<ClassNO;j+) sj+=sji; For (j=0;j<ClassNO;j+) EA+=sj/Record_No*Compute_PI(sji/sj); R

22、eturn total_I-EA;3.4、得到某数字在数组中的位置GetPosition(Data, DataSize,Value) For (i=0;i<DataSize;i+) if (Datai=value) return I; Return -1;3.5、计算Pi*LogPiFloat Compute_PI(float pi) If pi<=0 then return 0; If pi>=1 then return 0; Return 0-pi*log2(pi);五、实验报告要求1、用C语言或者其他语言实现上述相关算法。2、实验操作步骤和实验结果,实验中出现的问题和解

23、决方法。六、注意事项1、信息增益的计算;2、选择相关字段后根据相关字段的取值对数据集合进行划分。3、决策树构建的终止条件 数据挖掘实验指导书实验2-2 贝叶斯算法实现一、实验目的通过对贝叶斯算法的编程实现,加深对贝叶斯算法的理解,同时利用贝叶斯算法对简单应用实现预测分类实验类型:综合计划课间:2学时二、实验内容1、分析贝叶斯算法;2、计算条件概率;3、预测精度的计算与评估;4、编程实现贝叶斯分类算法,并对简单应用样本数据实现预测分类5. 参考实验数据/ml/machine-learning-databases/wine/三、实验方法1、实现贝叶

24、斯算法2、利用实验数据对贝叶斯算法进行检测3、求解精确度计算4、调试程序5、完成整个分类与评估的过程四、实验步骤4.1 算法过程描述:1)输入训练数据,将数据保存在DataBase二维数组中(数组的最后一个属性对应类别标号)2)设定训练数据集与测试数据集大小(指定从数组下标0开始到TrainSetSize-1所对应的数据为训练数据,其余为测试数据);3)计算训练数据集数据中各属性在各类中的概率分布情况;4)利用测试数据计算贝叶斯算法的分类精度;5)输出分类结果;4.2 数据处理A、实验数据RIDageincomestudentCredit_ratingBuyComputer130HighNoF

25、airNo230HighNoExcellentNo33140HighNoFairYes4>40medNoFairYes5>40LowYesFairYes6>40LowYesExcellentNo73140LowYesExcellentYes830MedNoFairNo930LowYesFairYes10>40MedYesFairYes1130MedYesExcellentYes123140MedNoExcellentYes133140HighYesFairYes14>40medNoExcellentNo B、对数据中的枚举类型数据进行转换以便于数据处理:0123C

26、lassNo100000200010310001421001522101622110712111801000902101102110111011111211011131010114210104.3 计算训练数据集数据中各属性在各类中的概率分布情况如图3-1所示4.4 利用测试数据计算贝叶斯算法的分类精度如图3-2所示NoNoYesYes申请AttSetSize*MaxAttSize*ClassSize大小的空间àAttributeDistributei=0i<AttSetSizej<TrainSetSizeAttributeDistributeiDataBasejiDat

27、aBasejAttSetSize-1+AttributeDistributeß0For (i=0;i<AttSize;i+) For (j=0;j<MaxAttSize;j+) For(k=0;k<ClassSize;k+) AttributeDistributeijk=0;j=0i+Noi=AttSetSize-1YesAttributeDistributei0DataBasejAttSetSize-1+j+ 图3-1 训练数据集各属性的概率分布计算申请ClassSize*ClassSize个空间àPrecisei<SetSizePresize&#

28、223;0 ; AttrClassDisß0For (i=0;i<ClassSize;i+) For (j=0;j<ClassSize;j+) Presizeij=0;i=TrainSetSize;i+j=0MaxP=0;ClassNo=0;Tempß计算属于类j的概率For (k=0;k<AttSetSize-1)Temp*=AttributeDistributekDataBaseikj/AttributeDistributeAttSetSize-10jTemp*=AttributeDistributeAttSetSize-10j/TrainSetj&l

29、t;ClassSizeTemp>MaxPMaxP=Temp;ClassNo=jj+PreciseDataBaseiAttrSetSize-1ClassNo+图3-2 贝叶斯算法的分类精度计算4.5 输出分类结果For (i=0;i<ClassSize;i+) printf(“n”); For (j=0;j<ClassSize;j+) printf(“t%d”, Preciseij); TotalCorrect+=Preciseii; printf(“nnTotal Correct is%d”,TotalCorrect);五、注意事项注意单个样例数据的概率计算与各字段的概率计算

30、的关系参考代码 (对参考数据的代码)BayesianClassifier.h#include <string>#include <vector>#include <set>#include <ctime> #include <algorithm>#include <cmath>#include <map>using namespace std;/ 1) Alcohol/ 2) Malic acid/ 3) Ash/ 4) Alcalinity of ash / 5) Magnesium/ 6) Total ph

31、enols/ 7) Flavanoids/ 8) Nonflavanoid phenols/ 9) Proanthocyanins/ 10)Color intensity/ 11)Hue/ 12)OD280/OD315 of diluted wines/ 13)Proline int TrainNum = 130;/所有训练数据的范围int TestNum = 48;struct OriginalDatadouble A1;double A2;double A3;double A4; double A5; double A6;double A7;double A8;double A9;doub

32、le A10;double A11;double A12;double A13;double A14;BayesianClassifier.cpp#include <iostream>#include <fstream>#include <sstream>#include "BayesianClassifier.h"using namespace std;const int Shuxing=13;/属性总数ifstream f;vector<OriginalData> trainData; /存放训练数据vector<O

33、riginalData> testData; /存放测试数据double A3; /先验概率int m;/存放每一类型,每种属性中某数值的概率map<double, double> C1_mapShuxing; map<double, double> C2_mapShuxing;map<double, double> C3_mapShuxing;/从文件中读取数值void DataRead(vector<OriginalData> &data, const char* fileName)f.open(fileName);int ZH

34、jiang;if (fileName0 = 'w')ZHjiang = TrainNum;else ZHjiang = TestNum;string line;OriginalData wine;for (int i = 0; i < ZHjiang; i+)f >> line;while (line.find(',') > 0 && line.find(',') < line.length()lineline.find(',') = ' ' istringstream

35、 stream(line);stream >> wine.A1 >> wine.A2 >> wine.A3 >> wine.A4 >> wine.A5 >> wine.A6 >> wine.A7 >> wine.A8 >> wine.A9 >> wine.A10 >> wine.A11 >> wine.A12 >> wine.A13 >> wine.A14;data.push_back(wine);f.close();void

36、bayes()int count1 = 0, count2 = 0, count3 = 0;int i;for(i = 0; i < TrainNum ; i+)if(trainDatai.A1 = 1)count1 +;if(trainDatai.A1 = 2)count2 +;if(trainDatai.A1 = 3)count3 +;/统计三类数据,各自求和A0 = (double)count1/(double)TrainNum; /求先验概率A1 = (double)count2/(double)TrainNum;A2 = (double)count3/(double)Train

37、Num;map<double, double>:iterator pipei; for(i = 0 ; i < TrainNum; i+) if(trainDatai.A1 = 1) /求P(Xk|C1) 中Xk的个数int j=0;for(;j< 13 ;j+)double temp = *(&trainDatai.A2+j);pipei = C1_mapj.find(temp);if(pipei = C1_mapj.end()C1_mapj.insert(map<double, double>:value_type(temp,1);elsedou

38、ble j = pipei->second;pipei->second = j + 1;if(trainDatai.A1 = 2) /求P(Xk|C2) 中Xk的个数int j = 0;for(;j< 13 ;j+)double temp = *(&trainDatai.A2+j);pipei = C2_mapj.find(temp);if(pipei = C2_mapj.end()C2_mapj.insert(map<double, double>:value_type(temp,1);elsedouble j = pipei->second;pi

39、pei->second = j + 1;if(trainDatai.A1 = 3) /求P(Xk|C3) 中Xk的个数int j = 0;for(;j< 13 ;j+)double temp = *(&trainDatai.A2+j);pipei = C3_mapj.find(temp);if(pipei = C3_mapj.end()C3_mapj.insert(map<double, double>:value_type(temp,1);elsedouble j = pipei->second;pipei->second = j + 1;/概率f

40、or(i = 0; i < Shuxing; i+)for(pipei=C1_mapi.begin(); pipei!=C1_mapi.end(); +pipei) double num = pipei->second; pipei->second = (double)num/(double)count1;for(pipei=C2_mapi.begin(); pipei!=C2_mapi.end(); +pipei) double num = pipei->second; pipei->second = (double)num/(double)count2;for

41、(pipei=C3_mapi.begin(); pipei!=C3_mapi.end(); +pipei) double num = pipei->second; pipei->second = (double)num/(double)count3; void houyan()/计算后验分布,找出最大值int i,j,k;double p3;for(i = 0; i<TestNum; i+)double pXC3=0,0,0;for(j = 0; j < 3; j+)map<double, double>:iterator pipei;/计算p(X|C1)f

42、or(k = 0; k < Shuxing; k+)pipei = C1_mapk.find(*(&testDatai.A2+k);if(pipei != C1_mapk.end()pXC0 =pXC0 + pipei->second;p0 = A0 * pXC0;/计算p(X|C2)for(k = 0; k < Shuxing; k+)pipei = C2_mapk.find(*(&testDatai.A2+k);if(pipei != C2_mapk.end()pXC1 =pXC1 + pipei->second;p1 = A1*pXC1;/计算p(

43、X|C3)for(k = 0; k < Shuxing; k+)pipei = C3_mapk.find(*(&testDatai.A2+k);if(pipei != C3_mapk.end()pXC2 =pXC2 + pipei->second;p2 = A2*pXC2;/找出最大值if(p0 > p1 && p0 >p2)cout<<p0<<" "<<1<<endl;if(testDatai.A1=1) m+;elseif(p1 > p2)cout<<p1&

44、lt;<" "<<2<<endl;if(testDatai.A1=2) m+;elsecout<<p2<<" "<<3<<endl;if(testDatai.A1=3) m+;void main()double tp,fp;cout<<"概率最大值 "<<"所属类别"<<endl;DataRead(trainData,"wine.data");bayes();DataRead(tes

45、tData,"test.data");houyan();tp=(double)m/51;fp=1-tp;cout<<"正确率为:"<<tp*100<<"%"<<endl; cout<<"错误率为:"<<fp*100<<"%"<<endl;实验3-1 C-Means聚类算法实现一、实验目的通过分析C-Means聚类算法的聚类原理,利用Vc编程工具(或者其他编程工具)实现C-Means和FCM聚类算法,并

46、通过对样本数据的聚类过程,加深对该聚类算法的理解与应用过程。实验类型:综合计划课间:6学时二、实验内容1、分析C-Means聚类算法和FCM;2、分析距离计算方法;3、分析聚类的评价准则;4、编程完成C-Means聚类算法和FCM,并基于相关实验数据实现聚类过程;三、实验方法1、C-means聚类算法原理 C-means聚类算法以C为参数,把n个对象分为C个簇,以使簇内的具有较高的相似度。相似度的计算根据一个簇中对象的平均值来进行。 算法描述: 输入:簇的数目C和包含n个对象的数据库输出:使平方误差准则最小的C个簇过程:任选C个对象作为初始的簇中心;Repeat for j=1 to n DO

47、 根据簇中对象的平均值,将每个对象赋给最类似的簇 for i=1 to C DO 更新簇的平均值 计算EUnitl E不再发生变化按簇输出相应的对象2、聚类评价准则:E的计算为:四、实验步骤4.1 实验数据见实验数据集Wine 和Iris数据4.2初始簇中心的选择选择k个样本作为簇中心 For (i=0;i<k;i+) For (j=0;j<AttSetSize;j+)ClusterCenterij=DataBaseij4.3 数据对象的重新分配 Sim=某一较大数;ClusterNo=-1; For (i=0;i<k;i+) If (Distance(DataBasej,ClusterCenteri)<Sim) Sim=Distance(DataBasej,ClusterCenteri);ClusterNo=i;ObjectClusterj=ClusterNo;4.4 簇的更新 For (i=0;i<k;i+)Temp=0;Num=0; For (j=0;j<n;j+)If (ObjectClusterj=i)Num+; Temp+=DataBasej;If (ClusterCenteri!=Temp) HasChanged=TRUE;C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论