这个算法的精髓在于,虽然其每次用的决策树的构成方式相同,但是,其每次所用的训练元祖并不同,没经过一次训练,其元祖中的那些被预测错误的元祖的权重会加大,使得下次训练更容易被选中,这样的几次训练会比较均匀,使得对于易错元祖的预测比较好。在k=8时,得出的离散型属性的预测准确度为0.73,连续型为0.95。
下面是我的代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package auxiliary;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import auxiliary.DecisionTree.DecisionTreeNode;
/**
*
* @author daq
*/
public class AdaBoost extends Classifier {
private final int K=8;
private double[][]newFeatures=null;
private double[]newLabels=null;
private double[][]testFeatures=null;
private double[]testLabels=null;
private double[][]selectedFeatures=null;
private double[]selectedLabels=null;
ArrayList<DecisionTree2> trees=new ArrayList<DecisionTree2>();
ArrayList<Double> treeWeights=new ArrayList<Double>();
private HashMap<Integer,Double> qualityMap=new HashMap<Integer,Double>();
private ArrayList<Integer> choosenLines=new ArrayList<Integer>();
private HashMap<Integer,Double> choosenQualityMap=new HashMap<Integer,Double>();
private ArrayList<Integer> truePredictedLines=new ArrayList<Integer>();//
public AdaBoost() {
}
public void setQualityMap(){
double quality=1.0/newFeatures.length;
for(int i=0;i<newFeatures.length;i++){
qualityMap.put(i,quality);
}
}
@Override
public void train(boolean[] isCategory, double[][] features, double[] labels) {
int trainSize=features.length;
int preSize=features.length-trainSize;
newFeatures=new double[trainSize][];
newLabels=new double[trainSize];
testFeatures=new double[preSize][];
testLabels=new double[preSize];
selectedFeatures=new double[trainSize][];
selectedLabels=new double[trainSize];
newFeatures=Arrays.copyOfRange(features,0,trainSize);
newLabels=Arrays.copyOfRange(labels, 0, trainSize);
testFeatures=Arrays.copyOfRange(features,trainSize,features.length);
testLabels=Arrays.copyOfRange(labels,trainSize,features.length);
setQualityMap();
for(int i=1;i<=K;i++){
produceNewLines();
buildSelectedFeaturesLabels();
DecisionTree2 tree=new DecisionTree2();
tree.train(isCategory, selectedFeatures,selectedLabels);
double m=computeM(tree);
if(m>0.5)
continue;
else{
trees.add(tree);
treeWeights.add(Math.log((1-m)*1.0/m));
updateQuality(m);
choosenLines.clear();
truePredictedLines.clear();
}
}
}
@SuppressWarnings("unchecked")
public void updateQuality(double m){
double w=m*1.0/(1-m);
HashMap<Integer,Double> tempMap=new HashMap<Integer, Double>();
tempMap=(HashMap<Integer, Double>)qualityMap.clone();
for(int i=0;i<selectedFeatures.length;i++){
int line=choosenLines.get(i);
if(truePredictedLines.contains(i)){
qualityMap.put(line, qualityMap.get(line)*w);
}
}
double newSum=0;
Iterator<Entry<Integer, Double>> ite=qualityMap.entrySet().iterator();
while(ite.hasNext()){
Entry<Integer, Double> entry=ite.next();
newSum+=entry.getValue();
}
double oldSum=0;
Iterator<Entry<Integer, Double>> ite2=tempMap.entrySet().iterator();
while (ite2.hasNext()) {
Entry<Integer, Double> entry=ite2.next();
oldSum+=entry.getValue();
}
double ratio=oldSum*1.0/newSum;
Iterator<Entry<Integer, Double>> ite3=qualityMap.entrySet().iterator();
while (ite3.hasNext()) {
Entry<Integer, Double> entry=ite3.next();
int key=entry.getKey();
double value=entry.getValue();
qualityMap.put(key, value*ratio);
}
}
public double computeM(DecisionTree2 tree){
int size=selectedFeatures.length;
int t=0;
for(int i=0;i<size;i++){
double res=tree.predict(selectedFeatures[i]);
if(res!=selectedLabels[i])
t++;
else
truePredictedLines.add(i);
}
return t*1.0/(size);
}
public void produceNewLines(){
double sum=0;
Iterator<Entry<Integer, Double>> ite=qualityMap.entrySet().iterator();
while(ite.hasNext()){
Entry<Integer,Double> entry=ite.next();
sum+=entry.getValue();
}
int lineNums=newFeatures.length;
for(int i=0;i<lineNums;i++){
double temp=Math.random()*sum;
Iterator<Entry<Integer, Double>> ite2=qualityMap.entrySet().iterator();
double t=0;
while(ite2.hasNext()){
Entry<Integer,Double> entry=ite2.next();
t+=entry.getValue();
if(t>=temp){
int key=entry.getKey();
choosenLines.add(key);
break;
}
}
}
return;
}
public void buildSelectedFeaturesLabels(){
int k=0;
int lineSize=newFeatures[0].length;
for(Integer line:choosenLines){
//selectedFeatures[k]=newFeatures[line];
//selectedLabels[k]=newLabels[line];
selectedFeatures[k]=Arrays.copyOf(newFeatures[line],lineSize);
selectedLabels[k]=newLabels[line];
k++;
}
}
@Override
public double predict(double[] features) {
HashMap<Double,Double> map=new HashMap<Double, Double>();
for(int i=0;i<trees.size();i++){
DecisionTree2 tree=trees.get(i);
double label=tree.predict(features);
if(map.get(label)==null){
map.put(label,treeWeights.get(i));
}else{
map.put(label,map.get(label)+treeWeights.get(i));
}
}
double max=0,maxIndex=0;
Iterator<Entry<Double, Double>> ite=map.entrySet().iterator();
while (ite.hasNext()) {
Entry<Double,Double> entry=ite.next();
if(entry.getValue()>max){
max=entry.getValue();
maxIndex=entry.getKey();
}
}
return maxIndex;
}
}
分享到:
相关推荐
西电数据挖掘大作业之编程实现Adaboost算法,西电数据挖掘大作业之编程实现Adaboost算法,仅供参考。
介绍Adaboost算法研究现状,值得一看
数据挖掘十大算法之Adaboost.ppt
代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost经典的分类算法代码代码 adaboost...
关键词:情感分析 AdaBoost 朴素贝叶斯 文本分类 数据挖掘Research of Sentiment Analysis based on AdaBoos
CBA算法是一种集成挖掘算法,因为他是建立在关联规则挖掘算法之上的,在已有的关联规则理论前提下,做分类判断,只是在算法的开始时对数据做处理,变成类似于事务的形式。详细介绍链接 RoughSets 粗糙集算法。粗糙...
而AdaBoost正是其中最成功的代表,被评为数据挖掘十大算法之一。在AdaBoost提出至今的十几年间,机器学习领域的诸多知名学者不断投入到算法相关理论的研究中去,扎实的理论为AdaBoost算法的成功应用打下了坚实的基础...
谱聚类-Adaboost集成数据挖掘算法在岩性识别中的应用,朱林奇,张冲,针对原有岩性分类方法精度较低、泛化能力不足、结果较不稳定以及不符合地质情况的事实,提出基于谱聚类-Adaboost集成算法的数据挖掘
国际权威的学术组织 the IEEE International Conference on Data Mining (ICDM) 2006 年 12 月评选出了数据挖掘领域的十大经典算法: C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost,kNN, Naive Bayes, and ...
本文先将数据进行预处理得到实验数据, 然后着重分析朴素贝叶斯判别分析算法、 AdaBoost 算法以及随机森林算法在口红销量预测中的效果, 并在随机森林算法中进行模型优化。 通过实验结果表明总评价数、 价格和描述...
信息时代和网络时代的到来,使得人们创造的数据量指数级上升。如何通过互联网挖掘信息,又如何...本文主要针对Adaboost算法的来源、发展、原理以及在人脸识别方面的应用进行阐述,最后对Adaboost算法的优缺点进行了分析
而AdaBoost正是其中最成功的代表,被评为数据挖掘十大算法之一。在AdaBoost提出至今的十几年间,机器学习领域的诸多知名学者不断投入到算法相关理论的研究中去,扎实的理论为AdaBoost算法的成功应用打下了坚实的基础...
数据挖掘经典算法 论文文献,C4.5,k-Means, SVM, Apriori, EM, PageRank, AdaBoost,kNN, Naive Bayes, and CART
谱聚类-Adaboost集成数据挖掘算法在岩性识别中的应用.pdf
详细介绍了10种在实际中用途最广、影响最大的数据挖掘算法:1C4.5;2K-Means;3SVM:SupportVectorMachines;4Apriori;5EM;6PageRank;7AdaBoost;8kNN:k-NearestNeighbors;9NaiveBayes;10CART:...
国际权威的学术组织评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART。 不仅仅是选中的十大算法,其实参加评选的18种算法,实际上随便拿出一...
C4.5, k-Means, SVM, Apriori, EM, PageRank,AdaBoost, kNN, Naive Bayes,CART (仅为简介)
数据挖掘十大算法思维导图:(1)聚类:k-Means;(2)分类:C4.5、kNN、Naive Bayes、CART;(3) Bagging and Boosting:AdaBoost;(4) 统计学习:SVM、EM;(5)链接挖掘:PageRank;(6)关联分析:Apriori。
数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。数据挖掘通常与计算机科学有关,并通过统计、在线分析处理、情报检索、机器 学习、专家系统(依靠过去的经验法则)和模式识别等诸多方法来实现...