adaboost算法的主要原理是训练若干个弱分类器,根据训练结果赋予它们不同的权值,最后再将这些弱分类器组合起来,形成一个强分类器,adaboost的基本原理在http://wenku.baidu.com/view/49478920aaea998fcc220e98.html###中已经有很详细的描述
这里使用上一篇博客中的感知器算法作为弱分类器,代码如下:
首先是adaboost算法的结果类
/** * * @author zhenhua.chen * @Description: adboost算法的结果类,包括弱分类器的集合和每个弱分类器的权重 * @date 2013-3-8 下午3:14:58 * */ public class AdboostResult { private ArrayList<ArrayList<Double>> weakClassifierSet; private ArrayList<Double> classifierWeightSet; public ArrayList<ArrayList<Double>> getWeakClassifierSet() { return weakClassifierSet; } public void setWeakClassifierSet(ArrayList<ArrayList<Double>> weakClassifierSet) { this.weakClassifierSet = weakClassifierSet; } public ArrayList<Double> getClassifierWeightSet() { return classifierWeightSet; } public void setClassifierWeightSet(ArrayList<Double> classifierWeightSet) { this.classifierWeightSet = classifierWeightSet; } }
adaboost算法:
/** * http://wenku.baidu.com/view/49478920aaea998fcc220e98.html * @author zhenhua.chen * @Description: TODO * @date 2013-3-8 下午3:09:36 * */ public class AdaboostAlgorithm { private static final int T = 30; // 迭代次数 PerceptronApproach pa = new PerceptronApproach(); // 弱分类器 /** * * @Title: adaboostClassify * @Description: 通过训练集计算出组合分类器 * @return AdboostResult * @throws */ public AdboostResult adaboostClassify(ArrayList<ArrayList<Double>> dataSet) { AdboostResult res = new AdboostResult(); int dataDimension; if(null != dataSet && dataSet.size() > 0) { dataDimension = dataSet.get(0).size(); } else { return null; } // 为每条数据的权重赋初值 ArrayList<Double> dataWeightSet = new ArrayList<Double>(); for(int i = 0; i < dataSet.size(); i ++) { dataWeightSet.add(1.0 / (double)dataSet.size()); } // 存储每个弱分类器的权重 ArrayList<Double> classifierWeightSet = new ArrayList<Double>(); // 存储每个弱分类器 ArrayList<ArrayList<Double>> weakClassifierSet = new ArrayList<ArrayList<Double>>(); for(int i = 0; i < T; i++) { // 计算弱分类器 ArrayList<Double> sensorWeightVector = pa.getWeightVector(dataSet, dataWeightSet); weakClassifierSet.add(sensorWeightVector); // 计算弱分类器误差 double error = 0; //分类数 int rightClassifyNum = 0; ArrayList<Double> cllassifyResult = new ArrayList<Double>(); for(int j = 0; j < dataSet.size(); j++) { double result = 0; for(int k = 0; k < dataDimension - 1; k++) { result += dataSet.get(j).get(k) * sensorWeightVector.get(k); } result += sensorWeightVector.get(dataDimension - 1); if(result < 0) { // 说明预测错误 error += dataWeightSet.get(j); cllassifyResult.add(-1d); } else{ cllassifyResult.add(1d); rightClassifyNum++; } } System.out.println("总数:" + dataSet.size() + "正确预测数" + rightClassifyNum); if(dataSet.size() == rightClassifyNum) { classifierWeightSet.clear(); weakClassifierSet.clear(); classifierWeightSet.add(1.0); weakClassifierSet.add(sensorWeightVector); break; } // 更新数据集中每条数据的权重并归一化 double dataWeightSum = 0; for(int j = 0; j < dataSet.size(); j++) { dataWeightSet.set(j, dataWeightSet.get(j) * Math.pow(Math.E, (-1) * 0.5 * Math.log((1 - error) / error) * cllassifyResult.get(j))); // 按照http://wenku.baidu.com/view/49478920aaea998fcc220e98.html,更新的权重少除一个常数 dataWeightSum += dataWeightSet.get(j); } for(int j = 0; j < dataSet.size(); j++) { dataWeightSet.set(j, dataWeightSet.get(j) / dataWeightSum); } // 计算次弱分类器的权重 double currentWeight = (0.5 * Math.log((1 - error) / error)); classifierWeightSet.add(currentWeight); System.out.println("classifier weight: " + currentWeight); } res.setClassifierWeightSet(classifierWeightSet); res.setWeakClassifierSet(weakClassifierSet); return res; } /** * * @Title: computeResult * @Description: 计算输入数据的类别 * @return double * @throws */ public int computeResult(ArrayList<Double> data, AdboostResult classifier) { double result = 0; int dataSize = data.size(); ArrayList<ArrayList<Double>> weakClassifierSet = classifier.getWeakClassifierSet(); ArrayList<Double> classifierWeightSet = classifier.getClassifierWeightSet(); for(int i = 0; i < weakClassifierSet.size(); i++) { for(int j = 0; j < dataSize; j++) { result += weakClassifierSet.get(i).get(j) * data.get(j) * classifierWeightSet.get(i); } result += weakClassifierSet.get(i).get(dataSize); } if(result > 0) { return 1; } else { return -1; } }
测试类:
public static void main(String[] args) { /** * 测试数据,产生两类随机数据一类位于圆内,另一类位于包含小圆的大圆内,成环状 * 小圆半径为1,大圆半径为2,公共圆心位于(2, 2)内 */ final int SMALL_CIRCLE_NUM = 24; final int RING_NUM = 34; ArrayList<ArrayList<Double>> dataSet = new ArrayList<ArrayList<Double>>(); // 产生小圆数据 for(int i = 0; i < SMALL_CIRCLE_NUM; i++) { double x = 1 + Math.random() * 2; // 1到3的随机数 double y = 1 + Math.random() * 2; // 1到3的随机数 if((x - 2) * (x - 2) + (y - 2) * (y - 2) - 1 <= 0) { //说明位于圆内 ArrayList<Double> smallCircle = new ArrayList<Double>(); smallCircle.add(x); smallCircle.add(y); smallCircle.add(1d); // 列别1 dataSet.add(smallCircle); } } // 产生外围环形数据 for(int i = 0; i < RING_NUM; i++) { double x1 = Math.random() * 4; double y1 = Math.random() * 4; if((x1 - 2) * (x1 - 2) + (y1 - 2) * (y1 - 2) - 4 < 0 && (x1 - 2) * (x1 - 2) + (y1 - 2) * (y1 - 2) - 1 > 0) { //说明位于环形区域内 ArrayList<Double> ring = new ArrayList<Double>(); ring.add(-x1); ring.add(-y1); ring.add(-1d); // 列别2 dataSet.add(ring); } } AdaboostAlgorithm algo = new AdaboostAlgorithm(); AdboostResult result = algo.adaboostClassify(dataSet); // 产生测试数据 for(int i = 0; i < 10; i++) { ArrayList<Double> testData = new ArrayList<Double>(); double x1 = Math.random() * 4; double y1 = Math.random() * 4; if((x1 - 2) * (x1 - 2) + (y1 - 2) * (y1 - 2) - 4 < 0 && (x1 - 2) * (x1 - 2) + (y1 - 2) * (y1 - 2) - 1 > 0) { testData.add(x1); testData.add(y1); } // double x = 1 + Math.random() * 2; // 1到3的随机数 // double y = 1 + Math.random() * 2; // 1到3的随机数 // if((x - 2) * (x - 2) + (y - 2) * (y - 2) - 1 <= 0) { //说明位于圆内 // testData.add(x); // testData.add(y); // } algo.computeResult(testData, result); System.out.println(algo.computeResult(testData, result)); } }
相关推荐
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
在Java中实现AdaBoost算法,你需要考虑以下几个关键部分: 1. **数据结构**: 设计数据结构来存储训练样本及其权重,以及弱分类器的信息。 2. **弱分类器**: 实现弱分类器的接口,例如决策树(如ID3、C4.5)或线性...
在Java编程环境下实现Adaboost算法,可以帮助开发者深入理解这个算法的工作原理,并将其应用到实际的机器学习项目中。下面将详细阐述Adaboost的基本概念、工作流程以及Java实现的关键步骤。 **Adaboost算法基础** ...
- `AdaBoost.java` 文件可能包含了AdaBoost算法的主要逻辑,包括初始化权重、迭代训练弱分类器和构建强分类器的函数。 - `Stump.java` 文件可能是用于构建弱分类器的类,通常是一个简单的决策树节点,基于一个特征...
Adaboost算法是一种重要的集成学习方法,特别是在弱分类器提升为强分类器的过程中表现出色。在数据挖掘领域,Adaboost被广泛应用于处理分类问题,尤其是面对不平衡数据集时,它能够有效地提升分类器的性能。这篇大...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
一篇很好的关于使用Adaboost算法的人脸检测方法
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
《Adaboost算法在Java中的实现》 Adaboost,全称为"Adaptive Boosting",是一种集成学习方法,主要用于构建强大的分类器。它通过迭代地训练一系列弱分类器,并结合它们的结果形成一个强分类器。这个过程的核心在于...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
**AdaBoost算法详解** AdaBoost(Adaptive Boosting)是一种集成学习方法,它通过迭代地训练一系列弱分类器并将它们组合成一个强分类器。在Java中实现AdaBoost,我们需要理解其基本原理、流程和核心代码实现。 **...
代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost...
adaboost算法java源码adaboost-交易系统 基于 adaboost 算法的交易系统,使用组合的弱分类器进行预测。 注意:首先,我应该谈谈这个计划及其实施动机。 投资有一定风险,请慎重决定。 我现在从未将这个程序应用于...
AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...
这个文件夹很可能包含了人脸检测项目的源代码,包括用Java实现的Haar特征和AdaBoost算法的代码文件。开发者可能在这里实现了特征提取、分类器训练、图像处理等功能,并提供了示例或者测试用例来验证其功能。 总的来...
【标题】中的“本科毕业设计-基于Haar特征与AdaBoost算法的人脸检测的实现”表明,这是一个关于计算机视觉领域的毕业设计项目,主要关注的是人脸识别技术。在这个项目中,开发者运用了Haar特征和AdaBoost算法来实现...
1、资源内容:本科毕业设计 matlab实现的基于Haar特征与AdaBoost算法的人脸检测的实现 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,...