贝叶斯网络-代码学习.pdf
- 文档编号:3217014
- 上传时间:2022-11-20
- 格式:PDF
- 页数:14
- 大小:528.78KB
贝叶斯网络-代码学习.pdf
《贝叶斯网络-代码学习.pdf》由会员分享,可在线阅读,更多相关《贝叶斯网络-代码学习.pdf(14页珍藏版)》请在冰豆网上搜索。
版权所有,仿冒必究-全同学1贝叶斯网络代码学习贝叶斯网络的整体思路包括了以下几个步骤:
1.训练数据的读取和校验-校验包括了未标识分类数据的剔除等2.初始化贝叶斯网络,主要以每个属性为一个节点,为每个节点创造一个父类节点的数组,同时当前属性节点有一个由父类属性值与当前节点属性值的叠成生成的数组,用于记录在每个父类属性值的组合情况下,当前属性中某个属性值的出现概率3.通过当前属性的顺序,无环构建实际的贝叶斯网络,其中下标为0的第一个节点始终为目标分类的那个节点,后面节点的依赖顺序,一般通过随机排序或者有专家进行专门设计而来,一般就是默认训练数据的属性输入顺序,这个阶段计算每个节点的可能父节点,父节点只能在当前节点下标之前的节点中找,通过贪心算法,假设每增加一个父节点的概率值大于当前最大概率值时候,就将这个父节点真正添加为当前节点的父节点。
通过这个步骤,完成贝叶斯网络里所有节点之前的父子关系4.通过实际的训练数据,计算每个父节点组合情况下,当前属性节点中某个属性值的出现的次数。
并统计该父节点组合情况下的整体实例的次数。
以备后面弄计算该节点的属性值的概率分布做分母5.测试数据的验证,在步骤四的模型下,计算每个目标分类的概率值,取最高的概率值为该条测试实例的最终预测分类具体的代码和函数为:
BayesNet的主要函数,buildClassifierbuildClassifier函数函数/removeinstanceswithmissingclassinstances=newInstances(instances);instances.deleteWithMissingClass();/这个这个函数函数主要主要是通过是通过训练训练每个实例,检查是否包含每个实例,检查是否包含要分类的那个属性,比如现在要对国家进行分类,但是发现要分类的那个属性,比如现在要对国家进行分类,但是发现某条某条实例数据内,没有国家这个属性,那实例数据内,没有国家这个属性,那么这个实例就不能参与到实际的模型训练中,就要么这个实例就不能参与到实际的模型训练中,就要删除删除掉;但是该函数的实际方法是将可用的实例掉;但是该函数的实际方法是将可用的实例单单独存储,独存储,最后在直接最后在直接赋值赋值替换。
替换。
(实际实际是把有值的部分是把有值的部分copy出来出来)/ensurewehaveadatasetwithdiscretevariablesonlyandwithnomissingvaluesinstances=normalizeDataSet(instances);/这个这个函数的主要作用是对实例进行函数的主要作用是对实例进行离散离散化,化,像属性为性别像属性为性别男,女男,女,本身就是离散的,无需离散,但是对于身高体重等,需要离散成多个属性本身就是离散的,无需离散,但是对于身高体重等,需要离散成多个属性值,因为在贝叶斯值,因为在贝叶斯网络网络中,所有中,所有属性属性的属性值的属性值都是都是通过通过属性值属性值id来标识的。
性别来标识的。
性别为为属性,男或者女就属性,男或者女就是是性别性别这个属性的属性值,这个属性的属性值,那么那么在性别这个属性里,男的属性值在性别这个属性里,男的属性值id为为0,女的属性值女的属性值id为为1/Copytheinstancesm_Instances=newInstances(instances);/给本类给本类自己的成员变量自己的成员变量/sanitycheck:
needmorethan1variableindatatsetm_NumClasses=instances.numClasses();/这个这个函数主要返回目标分类的属性具体的属性函数主要返回目标分类的属性具体的属性值的个数,比如我们要值的个数,比如我们要对对性别进行分类,那么性别在训练数据中的属性值只有男和女,那么属性值的性别进行分类,那么性别在训练数据中的属性值只有男和女,那么属性值的个数就是个数就是2,同理,如果我们要对国际分类,同理,如果我们要对国际分类,也也要看国际在训练数据中具体的属性值的种类有多少个。
要看国际在训练数据中具体的属性值的种类有多少个。
版权所有,仿冒必究-全同学2/initializeADTreeif(m_bUseADTree)/weka里默认是是里默认是是falsem_ADTree=ADNode.makeADTree(instances);/System.out.println(Oef,done!
);/buildthenetworkstructureinitStructure();/初始化初始化贝叶斯网络贝叶斯网络/buildthenetworkstructurebuildStructure();/根据实际根据实际的训练数据,的训练数据,设置设置每个属性节点的父节点每个属性节点的父节点/buildthesetofCPTsestimateCPTs();/根据根据已经创建好的贝叶斯网络,已经创建好的贝叶斯网络,再再一次根据实际的训练数据,获得一次根据实际的训练数据,获得每个每个属属性节点下的属性值,在不同的父节点组合情况下的性节点下的属性值,在不同的父节点组合情况下的出现出现次数的统计。
次数的统计。
/Savespace/m_Instances=newInstances(m_Instances,0);m_ADTree=null;补充补充介绍介绍对对测试数据进行实际分类的函数:
测试数据进行实际分类的函数:
distributionForInstanceBayesNet类中的initStructure函数介绍:
initStructure();/初始化贝叶斯网络初始化贝叶斯网络publicvoidinitStructure()throwsExceptionintnAttribute=0;for(intiOrder=1;iOrderm_Instances.numAttributes();iOrder+)if(nAttribute=m_Instances.classIndex()nAttribute+;/m_nOrderiOrder=nAttribute+;/上面上面这个这个for循环其实在这个函数中一点用循环其实在这个函数中一点用都都没有,没有,而且而且贝叶斯分类的默认贝叶斯分类的默认目标目标分类属性,是分类属性,是训练训练数据数据中的最后一个属性,所以该中的最后一个属性,所以该for循环循环中中判断判断毫无毫无作用作用,且且nAttribute这个这个参数在参数在这个这个函数内函数内也没有被实际使用也没有被实际使用/reservememorym_ParentSets=newParentSetm_Instances.numAttributes();/m_Instances.numAttributes()返回返回的是训练数据的实际属性个数,包括了的是训练数据的实际属性个数,包括了目标目标属性在内。
属性在内。
m_ParentSets是是表示所有属性节点的父节点,比如表示所有属性节点的父节点,比如性别性别属性,如果性别属性属性,如果性别属性id是是4,那么,那么m_ParentSets4就就存储的存储的是是性别属性节点的性别属性节点的父节点父节点for(intiAttribute=0;iAttributem_Instances.numAttributes();iAttribute+)/java中的数据实例化风格,需要每个元素都单独实例化。
中的数据实例化风格,需要每个元素都单独实例化。
m_ParentSetsiAttribute=newParentSet(m_Instances.numAttributes();版权所有,仿冒必究-全同学3/ParentSet这个类这个类的的构造函数构造函数publicParentSet(intnMaxNrOfParents)m_nParents=newintnMaxNrOfParents;/创建创建一个长度为训练数据属一个长度为训练数据属性个数的性个数的数组数组,用来用来存储当前节点的所有可能父节点存储当前节点的所有可能父节点m_nNrOfParents=0;/当前当前的父节点的个数的父节点的个数m_nCardinalityOfParents=1;/当前当前包含父节点包含父节点属性值属性值的的组合组合个数个数。
这里这里设置为设置为1,是为了方便后面当出现多个父节点后的是为了方便后面当出现多个父节点后的组合条件组合条件,如何在一维数组中表示,如何在一维数组中表示BayesNet类中的buildStructure函数介绍:
buildStructure();/根据实际根据实际的训练数据,的训练数据,设置设置每个属性节点的父节点每个属性节点的父节点publicvoidbuildStructure()throwsExceptionm_SearchAlgorithm.buildStructure(this,m_Instances);/是是一个一个贪心贪心算法,算法,weka中默认的是中默认的是K2搜索搜索算法算法,K2的的class继承了继承了SearchAlgorithm这个基这个基类,类,buildStructure也是也是SearchAlgorithm这个类的函数。
这个类的函数。
/buildStructure-/SearchAlgorithm类中的类中的buildStructure函数函数publicvoidbuildStructure(BayesNetbayesNet,Instancesinstances)throwsException/下面这个下面这个if语句可以略去,因为它表示是否有已经构建好的贝叶斯网络语句可以略去,因为它表示是否有已经构建好的贝叶斯网络图文件图文件,如果有,直接,如果有,直接读入读入完成完成贝叶斯网络的构建贝叶斯网络的构建。
但是但是weka中是么有的。
而且中是么有的。
而且实际实际大的大的贝叶斯贝叶斯网络也很少有专家指导直接网络也很少有专家指导直接只用只用子父类子父类关系图的。
关系图的。
if(m_sInitalBIFFile!
=null&!
m_sInitalBIFFile.equals()BIFReaderinitialNet=newBIFReader().processFile(m_sInitalBIFFile);for(intiAttribute=0;iAttributeinstances.numAttributes();iAttribute+)intiNode=initialNet.getNode(bayesNet.getNodeName(iAttribute);for(intiParent=0;iParentinitialNet.getNrOfParents(iAttribute);iParent+)StringsParent=initialNet.getNodeName(initialNet.getParent(iNode,iParent);intnParent=0;while(nParentbayesNet.getNrOfNodes()&!
bayesNet.getNodeName(nParent).equals(sParent)nParent+;if(nParentbayesNet.getNrOfNodes()bayesNet.getParentSet(iAttribute).addParent(nParent,instances);版权所有,仿冒必究-全同学4elseSystem.err.println(Warning:
Node+sParent+isignored.Itisfoundininitialnetw
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贝叶斯 网络 代码 学习