Weka开发[14]-AdaBoost源代码介绍

这一次讲的是Ensemble的东西,一位读者希望我讲一下Adaboost的内容,这种Ensemble看起来的确比较吓人,推荐一篇论文:Ensemble Based Systems in Decision Making. 在这里所有理论的东西我就不介绍了。

与以往一样,先看buildClassifier函数(我在函数中将不重要的代码全部去掉):

super.buildClassifier(data);

if ((!m_UseResampling)&& (m_Classifier instanceof WeightedInstancesHandler)) {

buildClassifierWithWeights(data);

} else {

buildClassifierUsingResampling(data);

}

Adaboost类继承自RandomizableIteratedSingleClassifierEnhancer类,再看一下这个类的buildClasssifier函数内容:

m_Classifiers = Classifier.makeCopies(m_Classifier, m_NumIterations);

这句话是产生m_NumIterations个基分类器。

接下来的是判断是否用Resampling方法,这个先不讲,直接看下面的函数,先讲buildClassifierWithWeights这个函数,代码太长了,我分开讲:

// Select instances to train the classifier on

if (m_WeightThreshold < 100) {

trainData = selectWeightQuantile(training,(double) m_WeightThreshold / 100);

} else {

trainData = new Instances(training, 0, numInstances);

}

最上面那个循环m_Classifiers.length次的循环没有粘,这一段话也没什么意思,就是说先多少样本训练,默认的是100,不是100的时候用selectWeightQuantile函数,这个函数是根据样本权重的比例来选择的,它先根据权重对样本进行排序,再选择样本。如果是默认值,那么当然是选择全部样本。

// Build the classifier

if (m_Classifiers[m_NumIterationsPerformed] instanceof Randomizable)

((Randomizable) m_Classifiers[m_NumIterationsPerformed])

.setSeed(randomInstance.nextInt());

m_Classifiers[m_NumIterationsPerformed].buildClassifier(trainData);

有的分类器是一个Randomizable实例,那么就给它设置种子,然后训练一个分类器。

// Evaluate the classifier

evaluation = new Evaluation(data);

evaluation.evaluateModel(m_Classifiers[m_NumIterationsPerformed],training);

epsilon = evaluation.errorRate();

// Stop if error too small or error too big and ignore this model

if (Utils.grOrEq(epsilon, 0.5) || Utils.eq(epsilon, 0)) {

if (m_NumIterationsPerformed == 0) {

// If we‘re the first we have to to use it

m_NumIterationsPerformed = 1;

}

break;

}

这一段,看过论文的人应该比较清楚是什么意思,这里也就不解释了。

// Determine the weight to assign to this model

m_Betas[m_NumIterationsPerformed] = Math.log((1 - epsilon)/ epsilon);

reweight = (1 - epsilon) / epsilon;

// Update instance weights

setWeights(training, reweight);

第一行代码对应我刚才讲的论文的图5中的公式15,第二句对应公式13,最后一句对应公式14,下面详细讲一下:

oldSumOfWeights = training.sumOfWeights();

Enumeration enu = training.enumerateInstances();

while (enu.hasMoreElements()) {

Instance instance = (Instance) enu.nextElement();

if (!Utils.eq(m_Classifiers[m_NumIterationsPerformed].

classifyInstance(instance), instance.classValue()))

instance.setWeight(instance.weight() * reweight);

}

// Renormalize weights

newSumOfWeights = training.sumOfWeights();

enu = training.enumerateInstances();

while (enu.hasMoreElements()) {

Instance instance = (Instance) enu.nextElement();

instance.setWeight(instance.weight() * oldSumOfWeights / newSumOfWeights);

}

这段代码也是adaboost的核心了,这个函数就是重新计算每个样本的权重,第一个if是判断是否分类错误,如果分类错误,就在原来的权重上乘上reweight(这地方我还有点不清楚,原论文上应该是分类正确了乘上reweight,公式14)。

底下的那部分代码就是重新归一化权重,没什么特别的。至于另一个函数buildClassifierUsingResampling,想想还是不讲了,与这个函数比较也没什么特别的地方。

时间: 2024-10-13 13:16:09

Weka开发[14]-AdaBoost源代码介绍的相关文章

Weka 开发[1]-Instances类

先google一下,把Weka软件下载下来,安装完成之后,在Weka的安装目录中有一个weka.jar的包. 把包添加到工程中后,就可以调用weka中的函数了. 再介绍一点weka的基本知识,在weka的目录下,有一个data的文件夹,里面存放的是一些数据集,以第一个数据集contact-lenses.arff为例,用EditPlus或是别的编辑器打开数据集,以%开头的表示的是一些注释,@relation表示这个数据集的名字,@attribute表示属性的属性,@data后就是数据集了,一般来说

Weka开发[9]—KMeans源码介绍

以前介绍的都是分类的内容,这一次介绍聚类,以最简单的SimpleKMeans源码为例. 分类中训练一个分类器是用buildClassifier(),在聚类中学习一个Clusterer是用buildCluster().分类中分类一个样本是用classifyInstance,而在聚类中是用clusterInstance.那我怎么知道这些的呢?(或者说:你怎么知道我是不是在骗你呢?)以ID3为例,你可以看出它继承自Classifier类,进入Classifier类,它有三个比较重要的函数,buildC

Weka开发[4]-特征选择

特征选择,我对这一部分也不熟,大概讲一下,用AttributeSelection进行特征选择,它需要设置3个方面,第一:对属性评价的类(自己到Weka软件里看一下,英文Attribute Evaluator),第二:搜索的方式(自己到Weka软件里看一下,英文Search Method),第三:就是你要进行特征选择的数据集了.最后调用Filter的静态方法userFilter,感觉写的都是废话,一看代码就明白了.唯一值得一说的也就是别把AttributeSelection的包加错了,代码旁边有注

[搜索引擎]Sphinx的介绍和原理探索

What/Sphinx是什么 定义 Sphinx是一个全文检索引擎. 特性 索引和性能优异 易于集成SQL和XML数据源,并可使用SphinxAPI.SphinxQL或者SphinxSE搜索接口 易于通过分布式搜索进行扩展 高速的索引建立(在当代CPU上,峰值性能可达到10 ~ 15MB/秒) 高性能的搜索 (在1.2G文本,100万条文档上进行搜索,支持高达每秒150~250次查询) Why/为什么使用Sphinx 遇到的使用场景 遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文

支付宝在ios应用上的开发[转]

前奏 现在随着移动开发的快速发展,越来越多的应用要求在线支付功能.最近做了一个关于支付宝支付功能的应用,在使用支付宝的过程中,遇到一些不必要的弯路,因此,写了这篇文章总结一下关于ios开发如何使用支付宝. 正文 首先,我们需要支付宝的功能,应该去支付宝的开发平台,下载sdk以及demo.地址:点击进入下载页面. 第一步.将需要的文件,静态库等拖入工程中,这里有:include,libs,Utilities,libcrypto.a,libssl.a文件. 如图: 上面就是我们所要得到的结果. 第二

Nutch 1.0 源代码分析[3] Plugin(2)

 Nutch 1.0 源代码分析[3] Plugin(2)  来自: http://c.tieba.baidu.com/p/3439551436 在URLNormalizers构造函数中,有一句没有看: this.extensionPoint =PluginRepository.get(conf).getExtensionPoint( URLNormalizer.X_POINT_ID); 看一下PluginRepository.get函数: public static synchronizedP

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

Nutch 1.0 源代码分析[8] CrawlDb

Nutch 1.0 源代码分析[8] CrawlDb 24MAR 2010 18:44:08 +0800 ---------------------------------------------------------------------------- 再接下来Crawl类中的重要的一行就是: http://c.tieba.baidu.com/p/3312872854 http://c.tieba.baidu.com/p/3312894881 http://c.tieba.baidu.co

[转]Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那这篇博文就是主要讲的如果定义这个指定的函数,这个指定的函数时什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连