贝叶斯网络-代码学习
贝叶斯网络-代码学习

版权所有,仿冒必究-------全同学
// initialize ADTree
if (m_bUseADTree) {//weka里默认是是false
m_ADTree = ADNode.makeADTree(instances);
//
System.out.println("Oef, done!");
} if (nParent< bayesNet.getNrOfNodes()) {
bayesNet.getParentSet(iAttribute).addParent(nParent, instances);
3
版权所有,仿冒必究-------全同学
} else { System.err.println("Warning: Node " + sParent + " is
initialNet.getNodeName(initialNet.getParent(iNode, iParent)); int nParent = 0; while (nParent < bayesNet.getNrOfNodes()
&& !bayesNet.getNodeName(nParent).equals(sParent)) { nParent++;
// reserve memory m_ParentSets = new ParentSet[m_Instances.numAttributes()]; // m_Instances.numAttributes()返回的是训练数据的实际属性个数,包括了目标属性在内。 m_ParentSets 是表示所有属性节点的父节点,比如性别属性,如果性别属性id是4,那么 m_ParentSets[4]就存储的是性别属性节点的父节点
贝叶斯网络python代码,贝叶斯网络工具箱-Python

贝叶斯⽹络python代码,贝叶斯⽹络⼯具箱-Python【实例简介】此⼯具箱只⽀持Python2版本,在Python3下可以⾃⾏修改。
允许使⽤单纯Python语⾔构建贝叶斯⽹络。
包含构建离散的贝叶斯⽹以及⾼斯贝叶斯⽹,推理算法包含消息树以及MCMC采样等。
允许搭建因⼦图模式下的BN⽹,同时包括⽹络实例。
有不清楚的地⽅欢迎⼀起交流。
【实例截图】【核⼼代码】bayesian-belief-networks-master└── bayesian-belief-networks-master├── bayesian│ ├── bbn.py│ ├── examples│ │ ├── bbns│ │ │ ├── cancer.py│ │ │ ├── earthquake.py│ │ │ ├── family_out_problem.py│ │ │ ├── huang_darwiche.py│ │ │ ├── __init__.py│ │ │ ├── monty_hall.py│ │ │ ├── pleasanton_weather.py│ │ │ ├── sprinkler.py│ │ │ └── walk.py│ │ ├── bif│ │ │ ├── alarm.bif│ │ │ ├── andes.bif│ │ │ ├── asia.bif│ │ │ ├── barley.bif│ │ │ ├── bif_inference_tester.py│ │ │ ├── bif_parser.py│ │ │ ├── cancer.bif│ │ │ ├── child.bif│ │ │ ├── diabetes.bif│ │ │ ├── earthquake.bif│ │ │ ├── hailfinder.bif│ │ │ ├── hepar2.bif│ │ │ ├── insurance.bif│ │ │ ├── link.bif│ │ │ ├── mildew.bif│ │ │ ├── munin.bif│ │ │ ├── pathfinder.bif│ │ │ ├── pigs.bif│ │ │ ├── README.txt│ │ │ ├── water.bif│ │ │ └── win95pts.bif│ │ ├── factor_graphs│ │ │ ├── cancer.py│ │ │ ├── earthquake.py│ │ │ ├── huang_darwiche.py│ │ │ ├── __init__.py│ │ │ ├── monty_hall.py│ │ │ ├── monty_hall_sampled.py │ │ │ └── walk.py│ │ ├── gaussian_bayesian_networks │ │ │ ├── __init__.py│ │ │ ├── koller.py│ │ │ └── river.py│ │ └── __init__.py│ ├── exceptions.py│ ├── factor_graph.py│ ├── gaussian_bayesian_network.py │ ├── gaussian_node.py│ ├── gaussian.py│ ├── graph.py│ ├── __init__.py│ ├── linear_algebra.py│ ├── persistance.py│ ├── stats.py│ ├── test│ │ ├── examples│ │ │ ├── bbns│ │ │ │ ├── test_cancer.py│ │ │ │ ├── test_earthquake.py│ │ │ │ ├── test_huang_darwiche.py│ │ │ │ └── test_monty_hall.py│ │ │ └── factor_graphs│ │ │ └── test_earthquake_fg.py│ │ ├── test_bbn.py│ │ ├── test_examples.py│ │ ├── test_factor_graph_verify.py│ │ ├── test_gaussian_bayesian_network.py │ │ ├── test_gaussian.py│ │ ├── test_gbn_examples.py│ │ ├── test_graph.py│ │ ├── test_linear_algebra.py│ │ ├── test_persistance.py│ │ └── test_undirected_graph.py│ └── utils.py├── docs│ └── tutorial│ ├── conf.py│ ├── index.rst│ ├── Makefile│ ├── _static│ │ ├── monty_hall_bbn.png│ │ └── monty_hall_bbn_variables.png│ ├── _themes│ │ ├── agogo_nn│ │ │ ├── layout.html│ │ │ ├── static│ │ │ │ ├── agogo.css_t│ │ │ │ ├── bgfooter.png│ │ │ │ └── bgtop.png│ │ │ └── theme.conf │ │ └── LICENSE│ └── tutorial.rst├── LICENSE.txt├── MANIFEST.in├── README.txt├── requirements.txt└── setup.py17 directories, 85 files。
贝叶斯优化的bpnn模型python代码-概述说明以及解释

贝叶斯优化的bpnn模型python代码-概述说明以及解释1.引言1.1 概述在这个部分,你可以描述贝叶斯优化和BP神经网络模型的基本概念和背景。
可以简要介绍贝叶斯优化是一种基于概率和贝叶斯理论的优化方法,用于在给定的限制条件下寻找最优解。
同时也可以介绍BP神经网络是一种常用的人工神经网络模型,用于解决分类和回归等问题。
你可以讨论贝叶斯优化和BP神经网络在不同领域的应用,以及它们之间结合起来的潜在优势。
可以指出这种结合可以帮助优化神经网络的超参数,提高训练效率和准确性。
最后,可以强调本文旨在探讨如何使用贝叶斯优化优化BP神经网络的参数,以提高其性能和应用范围。
1.2文章结构1.2 文章结构本文主要分为引言、正文和结论三部分。
具体结构安排如下:引言部分将会首先概述贝叶斯优化和BP神经网络,并介绍本文的研究目的。
正文部分主要分为三个小节。
首先是贝叶斯优化简介,介绍这一优化方法的原理和应用场景;接着是BP神经网络模型概述,解释BP神经网络的基本原理和结构;最后是结合贝叶斯优化和BP神经网络的优势,探讨将两者结合应用的好处和可行性。
结论部分将总结贝叶斯优化在BP神经网络中的应用情况,展望未来研究方向,并对整个文章进行总结概括。
1.3 目的:本文旨在探讨贝叶斯优化在BP神经网络中的应用,并分析结合两者的优势。
通过对贝叶斯优化和BP神经网络的简介,以及它们各自的优势进行论述,旨在为读者提供一个全面的了解和认识。
同时,本文也将总结贝叶斯优化在BP神经网络中的实际应用和未来研究方向,为相关领域的研究者和从业者提供参考和启发。
通过本文的阐述,希望能够为贝叶斯优化和BP神经网络的进一步研究和应用提供一定的指导和帮助。
2.正文2.1 贝叶斯优化简介:贝叶斯优化是一种通过在可能的目标函数空间中建立高斯过程来优化目标函数的方法。
其主要思想是在探索和利用之间进行权衡,通过不断地试验目标函数来找到最优解。
贝叶斯优化通常用于处理黑箱函数,即目标函数的具体形式未知,只能通过输入输出的对应关系进行观测。
贝叶斯分类器代码

贝叶斯分类器代码1. 介绍贝叶斯分类器是一种基于贝叶斯定理的概率分类器。
它通过学习一组训练数据,构建一个由特征和类别之间的条件概率组成的模型,然后用该模型对新的未知样本进行分类。
贝叶斯分类器在文本分类、垃圾邮件过滤、情感分析等任务中都得到了广泛应用。
本文将详细探讨贝叶斯分类器的代码实现,在Python中使用scikit-learn库进行演示。
2. 贝叶斯分类器原理贝叶斯分类器基于贝叶斯定理,根据条件概率计算样本的后验概率。
具体来说,给定一个样本x和一组类别y_1, y_2, …, y_n,贝叶斯分类器的任务是预测样本x 属于每个类别的概率,然后选择具有最高概率的类别作为预测结果。
贝叶斯分类器通过以下公式计算后验概率:P(y|x) = (P(x|y) * P(y)) / P(x)其中,P(y|x)是给定样本x的条件下样本属于类别y的概率,P(x|y)是属于类别y 的样本中具有特征x的概率,P(y)是类别y发生的先验概率,P(x)是样本具有特征x的概率。
3. 数据准备在编写贝叶斯分类器代码之前,首先需要准备用于训练和测试的数据。
这里以一个文本分类任务为例,使用20类新闻文本数据集(20 Newsgroups)作为示范数据。
首先,从库中加载新闻数据集:from sklearn.datasets import fetch_20newsgroupscategories = ['alt.atheism', 'sci.med', 'comp.graphics', 'sci.space'] # 选择四个类别作为示例data_train = fetch_20newsgroups(subset='train', categories=categories, shuffle =True, random_state=42)data_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=T rue, random_state=42)加载数据后,我们得到两个对象data_train和data_test,它们分别表示训练集和测试集。
贝叶斯网络

3.5 贝叶斯网络贝叶斯网络是一系列变量的联合概率分布的图形表示。
一般包含两个部分,一个就是贝叶斯网络结构图,这是一个有向无环图(DAG),其中图中的每个节点代表相应的变量,节点之间的连接关系代表了贝叶斯网络的条件独立语义。
另一部分,就是节点和节点之间的条件概率表(CPT),也就是一系列的概率值。
如果一个贝叶斯网络提供了足够的条件概率值,足以计算任何给定的联合概率,我们就称,它是可计算的,即可推理的。
3.5.1 贝叶斯网络基础首先从一个具体的实例(医疗诊断的例子)来说明贝叶斯网络的构造。
假设:命题S(moker):该患者是一个吸烟者命题C(oal Miner):该患者是一个煤矿矿井工人命题L(ung Cancer):他患了肺癌命题E(mphysema):他患了肺气肿命题S对命题L和命题E有因果影响,而C对E也有因果影响.命题之间的关系可以描绘成如右图所示的因果关系网.因此,贝叶斯网有时也叫因果网,因为可以将连接结点的弧认为是表达了直接的因果关系。
图3-5 贝叶斯网络的实例图中表达了贝叶斯网的两个要素:其一为贝叶斯网的结构,也就是各节点的继承关系,其二就是条件概率表CPT。
若一个贝叶斯网可计算,则这两个条件缺一不可。
贝叶斯网由一个有向无环图(DAG)及描述顶点之间的概率表组成.其中每个顶点对应一个随机变量。
这个图表达了分布的一系列有条件独立属性:在给定了父亲节点的状态后,每个变量与它在图中的非继承节点在概率上是独立的。
该图抓住了概率分布的定性结构,并被开发来做高效推理和决策。
贝叶斯网络能表示任意概率分布的同时,它们为这些能用简单结构表示的分布提供了可计算优势.假设对于顶点xi,其双亲节点集为Pai,每个变量xi的条件概率P(xi|Pai)。
则顶点集合X={x1,x2,…,xn}的联合概率分布可如下计算:。
双亲结点。
该结点得上一代结点。
该等式暗示了早先给定的图结构有条件独立语义。
它说明贝叶斯网络所表示的联合分布作为一些单独的局部交互作用模型的结果具有因式分解的表示形式。
机器学习--朴素贝叶斯算法原理、方法及代码实现

机器学习--朴素贝叶斯算法原理、⽅法及代码实现⼀、朴素的贝叶斯算法原理 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据,朴素贝叶斯分类算法是贝叶斯分类算法中最简单的⼀种,朴素的意思是条件概率独⽴性。
条件概率的三个重要公式: (1)概率乘法公式: P(AB)= P(B) P(A|B) = P(A) P(B|A) =P(BA) (2)全概率公式: (3)贝叶斯公式: 如果⼀个事物在⼀些属性条件发⽣的情况下,事物属于A的概率>属于B的概率,则判定事物属于A,这就是朴素贝叶斯的基本思想。
⼆、算法实现⼀般步骤 (1)分解各类先验样本数据中的特征。
(2)计算各类数据中,各特征的条件概率(⽐如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......)。
(3)分解待分类数据中的特征(特征1、特征2、特征3、特征4......)。
(4)计算各特征的各条件概率的乘积,如下所⽰: 判断为A类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4)..... 判断为B类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4)..... 判断为C类的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4)..... ...... (5)结果中的最⼤值就是该样本所属的类别。
三、应⽤举例 ⼆分类问题:⼤众点评、淘宝等电商上都会有⼤量的⽤户评论,有差评(1),有好评(0),现需要使⽤朴素贝叶斯分类算法来⾃动分类⽤户评论。
四、实际问题代码实现from numpy import *#贝叶斯算法def loadDataSet():trainData=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]labels=[0, 1, 0, 1, 0, 1] #1表⽰侮辱性⾔论,0表⽰正常⾔论return trainData, labels#⽣成词汇表def createVocabList(trainData):VocabList = set([])for item in trainData:VocabList = VocabList|set(item) #取两个集合的并集return sorted(list(VocabList)) #对结果排序后返回#对训练数据⽣成只包含0和1的向量集def createWordSet(VocabList, trainData):VocabList_len = len(VocabList) #词汇集的长度trainData_len = len(trainData) #训练数据的长度WordSet = zeros((trainData_len,VocabList_len)) #⽣成⾏长度为训练数据的长度列长度为词汇集的长度的列表for index in range(0,trainData_len):for word in trainData[index]:if word in VocabList: #其实也就是,训练数据包含的单词对应的位置为1其他为0WordSet[index][VocabList.index(word)] = 1return WordSet#计算向量集每个的概率def opreationProbability(WordSet, labels):WordSet_col = len(WordSet[0])labels_len = len(labels)WordSet_labels_0 = zeros(WordSet_col)WordSet_labels_1 = zeros(WordSet_col)num_labels_0 = 0num_labels_1 = 0for index in range(0,labels_len):if labels[index] == 0:WordSet_labels_0 += WordSet[index] #向量相加num_labels_0 += 1 #计数else:WordSet_labels_1 += WordSet[index] #向量相加num_labels_1 += 1 #计数p0 = WordSet_labels_0 * num_labels_0 / labels_lenp1 = WordSet_labels_1 * num_labels_1 / labels_lenreturn p0, p1trainData, labels = loadDataSet()VocabList = createVocabList(trainData)train_WordSet = createWordSet(VocabList,trainData)p0, p1 = opreationProbability(train_WordSet, labels)#到此就算是训练完成#开始测试testData = [['not', 'take', 'ate', 'my', 'stupid']] #测试数据test_WordSet = createWordSet(VocabList, testData) #测试数据的向量集res_test_0 = []res_test_1 = []for index in range(0,len(p0)):print(p0[index])if test_WordSet[0][index] == 0:res_test_0.append((1-p0[index]) * test_WordSet[0][index])res_test_1.append((1-p1[index]) * test_WordSet[0][index])else:res_test_0.append(p0[index] * test_WordSet[0][index])res_test_1.append(p1[index] * test_WordSet[0][index])if sum(res_test_0) > sum(res_test_1):print("属于0类别")else:print("属于1类别")运⾏结果:。
朴素贝叶斯的python源码实现

朴素贝叶斯的python源码实现朴素贝叶斯是一种简单但非常强大的分类算法,它基于贝叶斯定理和特征条件独立假设,被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。
在本文中,我们将通过Python源码实现朴素贝叶斯分类器,并详细解释其原理和实现步骤。
朴素贝叶斯算法的核心思想是利用已知类别的训练样本,通过计算每个特征在每个类别下的条件概率,来预测新样本的类别。
在实现朴素贝叶斯分类器之前,我们需要了解一些基本概念。
我们需要定义文档和类别。
文档是由词汇组成的集合,类别是文档所属的类别。
在文本分类中,文档即为文本,类别可以是正面评价和负面评价。
我们需要训练样本集,其中包含了已知类别的文档。
接下来,我们需要计算每个类别的先验概率,即P(c),表示一个文档属于某一类别的概率。
这可以通过统计训练样本中每个类别的文档数量来计算。
然后,我们需要计算每个词汇在每个类别下的条件概率,即P(w|c),表示在已知文档属于某一类别的情况下,该文档包含某个词汇的概率。
这可以通过统计训练样本中每个类别下每个词汇出现的次数来计算。
在实现朴素贝叶斯分类器时,我们首先需要进行训练。
我们将训练样本分为正面评价和负面评价两类,并统计每个类别的先验概率。
然后,我们统计每个类别下每个词汇出现的次数,并计算每个词汇在每个类别下的条件概率。
接着,我们需要对新样本进行分类。
给定一个新的文档,我们需要计算该文档属于每个类别的概率,并选择概率最大的类别作为分类结果。
计算文档属于某个类别的概率可以通过将文档中每个词汇在该类别下的条件概率相乘,并乘以该类别的先验概率得到。
下面是使用Python实现朴素贝叶斯分类器的源码:```pythonimport numpy as npclass NaiveBayesClassifier:def __init__(self):self.classes = Noneself.class_priors = Noneself.word_counts = Noneself.word_probs = Nonedef fit(self, X, y):self.classes = np.unique(y)self.class_priors = self.calculate_class_priors(y) self.word_counts = self.calculate_word_counts(X, y) self.word_probs = self.calculate_word_probs()def calculate_class_priors(self, y):class_priors = {}total_samples = len(y)for cls in self.classes:class_count = np.sum(y == cls)class_priors[cls] = class_count / total_samples return class_priorsdef calculate_word_counts(self, X, y):word_counts = {}for cls in self.classes:class_indices = np.where(y == cls)class_word_counts = np.sum(X[class_indices], axis=0)word_counts[cls] = class_word_countsreturn word_countsdef calculate_word_probs(self):word_probs = {}for cls in self.classes:total_words = np.sum(self.word_counts[cls])word_probs[cls] = (self.word_counts[cls] + 1) / (total_words + len(self.word_counts[cls]))return word_probsdef predict(self, X):predictions = []for x in X:class_probs = {}for cls in self.classes:class_prob = np.log(self.class_priors[cls]) for i, word in enumerate(x):if word > 0:class_prob += np.log(self.word_probs[cls][i]) * wordclass_probs[cls] = class_probpredicted_class = max(class_probs, key=class_probs.get)predictions.append(predicted_class)return predictions```在上述代码中,我们首先定义了一个NaiveBayesClassifier类,并初始化了一些成员变量。
贝叶斯网络全解 共64页

A和B的“head-to-tail型”和“tail-to-tail型”路径都通过C; A和B的“head-to-head型”路径不通过C以及C的子孙;
32
有向分离的举例
每个结点在给定其直接前驱时,条件独立于其非后继。
稍后详细解释此结论
18
一个简单的贝叶斯网络
19
全连接贝叶斯网络
每一对结点之间都有边连接
20
一个“正常”的贝叶斯网络
有些边缺失 直观上:
x1和x2独立 x6和x7在x4给定的条件下独立
x1,x2,…x7的联合分布:
21
BN(G, Θ) G:有向无环图 G的结点:随机变量 G的边:结点间的有向依赖 Θ:所有条件概率分布的参数集合 结点X的条件概率:P(X|parent(X))
思考:需要多少参数才能确定上述网络呢? 每个结点所需参数的个数:结点的parent数目是M,结点和 parent的可取值数目都是K:KM*(K-1) 为什么? 考察结点的parent对该结点形成了多少种情况(条件分布)
贝叶斯网络(Bayesian Network),又称有向无环图模 型(directed acyclic graphical model),是一种概率图 模型,借由有向无环图(Directed Acyclic Graphs, DAG)中得知一组随机变量{X1,X2...Xn}及其n组条 件概率分布(Conditional Probability Distributions, CPD)的性质。
Gas和Radio是独立的吗?给定Battery呢? Ignition呢?Starts呢?Moves呢?(答:IIIDD)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
// build the network structure initStructure(); //初始化贝叶斯网络
// build the network structure buildStructure(); //根据实际的训练数据,设置每个属性节点的父节点
// build the set of CPTs estimateCPTs(); //根据已经创建好的贝叶斯网络,再一次根据实际的训练数据,获得每个属 性节点下的属性值,在不同的父节点组合情况下的出现次数的统计。
// reserve memory m_ParentSets = new ParentSet[m_Instances.numAttributes()]; // m_Instances.numAttributes()返回的是训练数据的实际属性个数,包括了目标属性在内。 m_ParentSets 是表示所有属性节点的父节点,比如性别属性,如果性别属性id是4,那么 m_ParentSets[4]就存储的是性别属性节点的父节点
iAttribute++) { int iNode = initialNet.getNode(bayesNet.getNodeName(iAttribute)); for (int iParent = 0; iParent <
initialNet.getNrOfParents(iAttribute);iParent++) { String sParent =
ignored. It is found in initial network but not in data set."); }
} } } else if (m_bInitAsNaiveBayes) { //这个if也不会执行,因为选择的是贝叶斯网络,所 以不会用朴素贝叶斯来完成。 int iClass = instances.classIndex(); // initialize parent sets to have arrow from classifier node to // each of the other nodes for (int iAttribute = 0; iAttribute < instances.numAttributes(); iAttribute++) {
//下面这个if语句可以略去,因为它表示是否有已经构建好的贝叶斯网络图文件,如果有,直接 读入完成贝叶斯网络的构建。但是weka中是么有的。而且实际大的贝叶斯网络也很少有专家指导直接 只用子父类关系图的。
if (m_sInitalBIFFile != null && !m_sInitalBIFFile.equals("")) { BIFReader initialNet = new BIFReader().processFile(m_sInitalBIFFile); for (int iAttribute = 0; iAttribute < instances.numAttributes();
-------------------------------------------------------------------------//K2 类中的 search 函数,K2 继承了 LocalScoreSearchAlgorithm 类,LocalScoreSearchAlgorithm 继承了 SearchAlgorithm 类 public void search (BayesNet bayesNet, Instances instances) throws Exception {
initialNet.getNodeName(initialNet.getParent(iNode, iParent)); int nParent = 0; while (nParent < bayesNet.getNrOfNodes()
&& !bayesNet.getNodeName(nParent).equals(sParent)) { nParent++;
nAttribute++;
}
//
m_nOrder[iOrder] = nAttribute++;
}//上面这个for循环其实在这个函数中一点用都没有,而且贝叶斯分类的默认目标分类属性,是
训练数据中的最后一个属性,所以该for循环中判断毫无作用,且nAttribute这个参数在这个函数内
也没有被实际使用
2
版权所有,仿冒必究-------全同学
//ParentSet这个类的构造函数
public ParentSet(int nMaxNrOfParents) { m_nParents = new int[nMaxNrOfParents];//创建一个长度为训练数据属
性个数的数组,用来存储当前节点的所有可能父节点
for (int iAttribute = 0; iAttribute < m_Instances.numAttributes(); iAttribute++) {//java中的数据实例化风格,需要每个元素都单独实例化。
m_ParentSets[iAttribute] = new ParentSet(m_Instances.numAttributes());
类,buildStructure也是SearchAlgorithm这个类的函数。 } // buildStructure
------------------------------------------------------------------------//SearchAlgorithm 类中的 buildStructure 函数 public void buildStructure(BayesNet bayesNet, Instances instances) throws Exception {
iesNet.getParentSet(iAttribute).addParent(iClass, instances);
} } } search(bayesNet, instances); //search算法是实际子类中实现的,及K2这个类中的search函数 if (m_bMarkovBlanketClassifier) { doMarkovBlanketCorrection(bayesNet, instances); } } // buildStructure
// Copy the instances m_Instances = new Instances(instances);//给本类自己的成员变量
// sanity check: need more than 1 variable in datat set m_NumClasses = instances.numClasses();//这个函数主要返回目标分类的属性具体的属性 值的个数,比如我们要对性别进行分类,那么性别在训练数据中的属性值只有男和女,那么属性值的 个数就是2,同理,如果我们要对国际分类,也要看国际在训练数据中具体的属性值的种类有多少个。
1
版权所有,仿冒必究-------全同学
// initialize ADTree
if (m_bUseADTree) {//weka里默认是是false
m_ADTree = ADNode.makeADTree(instances);
//
System.out.println("Oef, done!");
public void initStructure() throws Exception { int nAttribute = 0;
for (int iOrder = 1; iOrder < m_Instances.numAttributes(); iOrder++) {
if (nAttribute == m_Instances.classIndex()) {
} if (nParent< bayesNet.getNrOfNodes()) {
bayesNet.getParentSet(iAttribute).addParent(nParent, instances);
3
版权所有,仿冒必究-------全同学
} else { System.err.println("Warning: Node " + sParent + " is
// Save space // m_Instances = new Instances(m_Instances, 0); m_ADTree = null;
补充介绍对测试数据进行实际分类的函数:distributionForInstance
BayesNet 类中的 initStructure 函数介绍: initStructure(); //初始化贝叶斯网络
m_nNrOfParents = 0;//当前的父节点的个数 m_nCardinalityOfParents = 1;//当前包含父节点属性值的组合个数。这里
设置为1,是为了方便后面当出现多个父节点后的组合条件,如何在一维数组中表示
}
} }
BayesNet 类中的 buildStructure 函数介绍: buildStructure(); //根据实际的训练数据,设置每个属性节点的父节点
具体的代码和函数为: BayesNet 的主要函数,buildClassifier
buildClassifier 函数
// remove instances with missing class instances = new Instances(instances); instances.deleteWithMissingClass();//这个函数主要是通过训练每个实例,检查是否包含 要分类的那个属性,比如现在要对国家进行分类,但是发现某条实例数据内,没有国家这个属性,那 么这个实例就不能参与到实际的模型训练中,就要删除掉;但是该函数的实际方法是将可用的实例单 独存储,最后在直接赋值替换。(实际是把有值的部分copy出来)