.word范文昆明理工大学信息工程与自动化学院学生实验报告(2011—2012学年第1学期)课程名称:人工智能开课实验室:信自楼计算机机房4442011年12月16日专业班级0学号200姓名成绩实验名称天气决策树指导教师教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:2011年12月日一、上机目的及内容1.上机内容根据下列给定的14个数据,运用InformationGain构造一个天气决策树。例子编号属性分类天况温度湿度风况1晴热大无N2晴热大有N3多云热大无P4雨中大无P5雨冷正常无P6雨冷正常有N7多云冷正常有P8晴中大无N9晴冷正常无P10雨中正常无P11晴中正常有P12多云中大有P.word范文13多云热正常无P14雨中大有N2.上机目的(1)学习用InformationGain构造决策树的方法;(2)在给定的例子上,构造出正确的决策树;(3)理解并掌握构造决策树的技术要点。二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)设计并实现程序,构造出正确的决策树;(2)对所设计的算法采用大O符号进行时间复杂性和空间复杂性分析;主函数流程图:Attributevalue.cpp流程图.word范文Basefun流程图:Datapiont.cpp流程图:Dataset主要流程图:.word范文三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUALC++6.0软件四、实验方法、步骤(或:程序代码或操作过程)工程源代码:Main.cpp:#includefstream#includeiostream#includelist.word范文#includesstream#includestring#includevector#includeAttributeValue.h#includeDataPoint.h#includeDataSet.hDataPointprocessLine(std::stringconst&sLine){std::istringstreamisLine(sLine,std::istringstream::in);std::vectorAttributeValueattributes;//TODO:needtohandlebeginningandendingemptyspaces.while(isLine.good()){std::stringrawfield;isLinerawfield;attributes.push_back(AttributeValue(rawfield));}.word范文AttributeValuev=attributes.back();attributes.pop_back();booltype=v.GetType();returnDataPoint(attributes,type);}voidmain(){std::ifstreamifs(in.txt,std::ifstream::in);DataSetinitDataset;while(ifs.good()){//TODO:needtohandleemptylines.std::stringsLine;std::getline(ifs,sLine);initDataset.addDataPoint(processLine(sLine));}std::listDataSetprocessQ;std::vectorDataSetfinishedDataSet;.word范文processQ.push_back(initDataset);while(processQ.size()0){std::vectorDataSetsplittedDataSets;DataSetdataset=processQ.front();dataset.splitDataSet(splittedDataSets);processQ.pop_front();for(inti=0;isplittedDataSets.size();++i){floatprob=splittedDataSets[i].getPositiveProb();if(prob==0.0||prob==1.0){finishedDataSet.push_back(splittedDataSets[i]);}else{processQ.push_back(splittedDataSets[i]);}.word范文}}std::coutThedicisiontreeis:std::endl;for(inti=0;ifinishedDataSet.size();++i){finishedDataSet[i].display();}}Attributevalue.cpp:#includeAttributeValue.h#includebase.hAttributeValue::AttributeValue(std::stringconst&instring):m_value(instring){}boolAttributeValue::GetType(){if(m_value==P){returntrue;}elseif(m_value==N){returnfalse;}else{throwDataErrException();}}.word范文Basefun.cpp:#includemath.hfloatlog2(floatx){return1.0/log10(2)*log10(x);}floatcalEntropy(floatprob){floatsum=0;if(prob==0||prob==1){return0;}sum-=prob*log2(prob);sum-=(1-prob)*log2(1-prob);returnsum;}Datapiont.cpp:#includeiostream#includeDataPoint.hDataPoint::DataPoint(std::vectorAttributeValueconst&attributes,booltype):m_type(type){for(inti=0;iattributes.size();++i){m_attributes.push_back(attributes[i]);}}voidDataPoint::display(){for(inti=0;im_attributes.size();++i){std::cout\tm_attributes[i].getValue();}.word范文if(true==m_type){std::cout\tP;}else{std::cout\tN;}std::coutstd::endl;}Dataset.cpp:#includeiostream#includemap#includebase.h#includeDataSet.hvoidSplitAttributeValue::display(){std::cout\tSplitattributeID(m_attributeIndex)\t;std::coutSplitattributevalue(m_v.getValue())std::endl;}voidDataSet::addDataPoint(DataPointconst&datapoint){m_data.push_back(datapoint);}floatDataSet::getPositiveProb(){floatnPositive=0;for(inti=0;im_data.size();++i){if(m_data[i].isPositive()){nPositive++;}}returnnPositive/m_data.size();.word范文}structStat{intnPos;intnNeg;intid;};voidDataSet::splitDataSet(std::vectorDataSet&splittedSets){//findallavailablesplittingattributesintnAttributes=m_data[0].getNAttributes();inti,j;std::vectorboolsplittingAttributeBV;splittingAttributeBV.resize(nAttributes);for(i=0;inAttributes;++i){splittingAttributeBV[i]=true;}for(i=0;im_splitAttributes.size();++i){splittingAttributeBV[m_splitAttributes[i].getAttributeIndex()]=false;}std::vectorintsplittingAttributeIds;for(i=0;inAttributes;++i){if(true==splittingAttributeBV[i]){splittingAttributeIds.push_back(i);}}typedefstd::mapAttributeValue,Stat,AttributeValueCmpAttributeValueStat;typedefstd::mapAttributeValue,Stat,AttributeValueCmp::iteratorAttributeValueStat_iterator;typedefstd::mapAttributeValue,Stat,AttributeValueCmp::const_iteratorAttributeValueStat_const_iterator;//gothroughdataonce,andcollectneededstatisticstocalculateentropystd::vectorAttributeValueStatsplittingStats;splittingStats.resize(splittingAttributeIds.size());.word范文for(i=0;im_data.size();++i){for(j=0;jsplittingAttributeIds.size();++j){AttributeValueconst&v=m_data[i].getAttribute(splittingAttributeIds[j]);AttributeValueStat_iteratorit=splittingStats[j].find(v);if(splittingStats[j].end()==it){Statstat;if(m_data[i].isPositive()){stat.nPos=1;stat.nNeg=0;stat.id=0;}else{stat.nPos=0;stat.nNeg=1;stat.id=0;}splittingStats[j].insert(std::pairAttributeValue,Stat(v,stat));}else{if(m_data[i].isPositive()){it-second.nPos++;}else{it-second.nNeg++;}}}}//displaycollectedstatisticsfor(j=0;jspli