`
czhsuccess
  • 浏览: 41819 次
社区版块
存档分类
最新评论

java实现adaboost算法

阅读更多

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));
		}
		
	}

 

分享到:
评论
3 楼 微笑春天 2014-09-23  
楼主 if(result < 0) { // 说明预测错误 
                    error += dataWeightSet.get(j); 
                    cllassifyResult.add(-1d); 
                } else{  
                    cllassifyResult.add(1d); 
                    rightClassifyNum++; 
                } 
这句话中-ld和ld表示啥子意思 我看不懂啊 谢谢指点哈 其他地方我都觉得没有问题 看得懂 我是刚学这个算法的哈
2 楼 czhsuccess 2014-05-08  
reacherxu 写道
楼主  PerceptronApproach 这个类没有提供啊

这个类在http://czhsuccess.iteye.com/blog/1897914中。
1 楼 reacherxu 2013-10-13  
楼主  PerceptronApproach 这个类没有提供啊

相关推荐

    Java实现AdaBoost算法:完整教程与源码.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    AdaBoost算法java实现

    在Java中实现AdaBoost算法,你需要考虑以下几个关键部分: 1. **数据结构**: 设计数据结构来存储训练样本及其权重,以及弱分类器的信息。 2. **弱分类器**: 实现弱分类器的接口,例如决策树(如ID3、C4.5)或线性...

    adaboost算法(java)

    在Java编程环境下实现Adaboost算法,可以帮助开发者深入理解这个算法的工作原理,并将其应用到实际的机器学习项目中。下面将详细阐述Adaboost的基本概念、工作流程以及Java实现的关键步骤。 **Adaboost算法基础** ...

    AdaBoost算法java实现统计学习方法例子

    - `AdaBoost.java` 文件可能包含了AdaBoost算法的主要逻辑,包括初始化权重、迭代训练弱分类器和构建强分类器的函数。 - `Stump.java` 文件可能是用于构建弱分类器的类,通常是一个简单的决策树节点,基于一个特征...

    西电数据挖掘大作业之编程实现Adaboost算法

    Adaboost算法是一种重要的集成学习方法,特别是在弱分类器提升为强分类器的过程中表现出色。在数据挖掘领域,Adaboost被广泛应用于处理分类问题,尤其是面对不平衡数据集时,它能够有效地提升分类器的性能。这篇大...

    手把手教你用Java编写AdaBoost算法.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    AdaBoost算法Java实现:机器学习入门指南.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    Java语言下的AdaBoost算法实现与应用.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    基于肤色分割和AdaBoost算法的彩色图像的人脸检测

    一篇很好的关于使用Adaboost算法的人脸检测方法

    AdaBoost算法的Java代码实现与优化.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    BNL.zip_adaboost in java_adaboost java_bnl_zip

    《Adaboost算法在Java中的实现》 Adaboost,全称为"Adaptive Boosting",是一种集成学习方法,主要用于构建强大的分类器。它通过迭代地训练一系列弱分类器,并结合它们的结果形成一个强分类器。这个过程的核心在于...

    AdaBoost算法在Java中的高效实现.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    AdaBoost算法Java版:高效分类器构建.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    adaboost java 实现

    **AdaBoost算法详解** AdaBoost(Adaptive Boosting)是一种集成学习方法,它通过迭代地训练一系列弱分类器并将它们组合成一个强分类器。在Java中实现AdaBoost,我们需要理解其基本原理、流程和核心代码实现。 **...

    代码 adaboost经典的分类算法代码

    代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost...

    adaboost算法java源码-adaboost-trading-system:基于adaboost算法的交易系统,使用组合的弱分类器进行预

    adaboost算法java源码adaboost-交易系统 基于 adaboost 算法的交易系统,使用组合的弱分类器进行预测。 注意:首先,我应该谈谈这个计划及其实施动机。 投资有一定风险,请慎重决定。 我现在从未将这个程序应用于...

    AdaBoost算法详解与Java编程实践.zip

    AdaBoost算法Java实现提供了高效的分类解决方案。该资源包含完整的Java源代码、教程文档、示例数据和测试脚本,旨在帮助用户快速理解和应用AdaBoost算法。适用于对机器学习感兴趣的开发者、数据科学家以及需要提升...

    本科毕业设计 基于Haar特征与AdaBoost算法的人脸检测的实现.zip

    这个文件夹很可能包含了人脸检测项目的源代码,包括用Java实现的Haar特征和AdaBoost算法的代码文件。开发者可能在这里实现了特征提取、分类器训练、图像处理等功能,并提供了示例或者测试用例来验证其功能。 总的来...

    本科毕业设计-基于Haar特征与AdaBoost算法的人脸检测的实现.zip

    【标题】中的“本科毕业设计-基于Haar特征与AdaBoost算法的人脸检测的实现”表明,这是一个关于计算机视觉领域的毕业设计项目,主要关注的是人脸识别技术。在这个项目中,开发者运用了Haar特征和AdaBoost算法来实现...

    本科毕业设计 matlab实现的基于Haar特征与AdaBoost算法的人脸检测的实现

    1、资源内容:本科毕业设计 matlab实现的基于Haar特征与AdaBoost算法的人脸检测的实现 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、注释明细,都经过测试运行成功,...

Global site tag (gtag.js) - Google Analytics