Ignore:
Timestamp:
05/05/06 07:46:50 (19 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mranforest/MRanForest.cc

    r7685 r7693  
    5151#include "MParList.h"
    5252
     53#include "MArrayI.h"
     54#include "MArrayF.h"
     55
    5356#include "MLog.h"
    5457#include "MLogManip.h"
     
    301304
    302305    fHadTrue.Set(numdata);
    303     fHadTrue.Reset(0);
     306    fHadTrue.Reset();
    304307
    305308    for (Int_t j=0;j<numdata;j++)
     
    312315    // setup labels for classification/regression
    313316    fClass.Set(numdata);
    314     fClass.Reset(0);
     317    fClass.Reset();
    315318
    316319    if (fClassify)
     
    320323    // allocating and initializing arrays
    321324    fHadEst.Set(numdata);
    322     fHadEst.Reset(0);
     325    fHadEst.Reset();
    323326
    324327    fNTimesOutBag.Set(numdata);
    325     fNTimesOutBag.Reset(0);
     328    fNTimesOutBag.Reset();
    326329
    327330    fDataSort.Set(dim*numdata);
    328     fDataSort.Reset(0);
     331    fDataSort.Reset();
    329332
    330333    fDataRang.Set(dim*numdata);
    331     fDataRang.Reset(0);
     334    fDataRang.Reset();
    332335
    333336    Bool_t useweights = fWeight.GetSize()==numdata;
     
    438441
    439442        if(calcResolution)
    440             *fLog << "no. of tree  no. of nodes  resolution in % (from oob-data -> overest. of error)" << endl;
     443            *fLog << "TreeNum BagSize NumNodes TestSize res/% (from oob-data -> overest. of error)" << endl;
    441444        else
    442             *fLog << "no. of tree  no. of nodes  rms in % (from oob-data -> overest. of error)" << endl;
     445            *fLog << "TreeNum BagSize NumNodes TestSize rms/% (from oob-data -> overest. of error)" << endl;
    443446                     //        12345678901234567890123456789012345678901234567890
    444447    }
     
    450453    // bootstrap aggregating (bagging) -> sampling with replacement:
    451454
    452     TArrayF classpopw(nclass);
    453     TArrayI jinbag(numdata); // Initialization includes filling with 0
    454     TArrayF winbag(numdata); // Initialization includes filling with 0
     455    MArrayF classpopw(nclass);
     456    MArrayI jinbag(numdata); // Initialization includes filling with 0
     457    MArrayF winbag(numdata); // Initialization includes filling with 0
    455458
    456459    float square=0;
     
    463466        // all events in the training sample
    464467 
    465         const Int_t k = Int_t(gRandom->Rndm()*numdata);
     468        const Int_t k = gRandom->Integer(numdata);
    466469
    467470        if(fClassify)
     
    472475        mean  +=fHadTrue[k]*fWeight[k];
    473476        square+=fHadTrue[k]*fHadTrue[k]*fWeight[k];
    474  
    475         winbag[k]+=fWeight[k];
     477
     478        winbag[k]+=fWeight[k]; // Increase weight if chosen more than once
    476479        jinbag[k]=1;
    477 
    478480    }
    479481
     
    483485    // In bagging procedure ca. 2/3 of all elements in the original
    484486    // training sample are used to build the in-bag data
    485     TArrayI datsortinbag=fDataSort;
    486     Int_t ninbag=0;
    487 
    488     ModifyDataSort(datsortinbag, ninbag, jinbag);
    489 
    490     fRanTree->GrowTree(fMatrix,fHadTrue,fClass,datsortinbag,fDataRang,classpopw,mean,square,
     487    const MArrayF hadtrue(fHadTrue.GetSize(), fHadTrue.GetArray());
     488    const MArrayI fclass(fClass.GetSize(), fClass.GetArray());
     489    const MArrayI datarang(fDataRang.GetSize(), fDataRang.GetArray());
     490
     491    MArrayI datsortinbag(fDataSort.GetSize(), fDataSort.GetArray());
     492
     493    ModifyDataSort(datsortinbag, jinbag);
     494
     495    fRanTree->GrowTree(fMatrix,hadtrue,fclass,datsortinbag,datarang,classpopw,mean,square,
    491496                       jinbag,winbag,nclass);
    492497
     
    501506    // determined from oob-data is underestimated, but can still be taken as upper limit.
    502507
     508    Int_t ninbag = 0;
    503509    for (Int_t ievt=0;ievt<numdata;ievt++)
    504510    {
    505511        if (jinbag[ievt]>0)
     512        {
     513            ninbag++;
    506514            continue;
     515        }
    507516
    508517        fHadEst[ievt] +=fRanTree->TreeHad((*fMatrix), ievt);
    509518        fNTimesOutBag[ievt]++;
    510 
    511519    }
    512520
     
    529537    //-------------------------------------------------------------------
    530538    // give running output
    531     *fLog << setw(5)  << fTreeNo;
    532     *fLog << setw(18) << fRanTree->GetNumEndNodes();
     539    *fLog << setw(4) << fTreeNo;
     540    *fLog << Form(" %8.1f", 100.*ninbag/numdata);
     541    *fLog << setw(9) << fRanTree->GetNumEndNodes();
     542    *fLog << Form("  %9.1f", 100.*n/numdata);
    533543    *fLog << Form("%18.2f", ferr*100.);
    534544    *fLog << endl;
     
    563573        {
    564574            v[n]=(*fMatrix)(n,mvar);
    565             isort[n]=n;
     575            //isort[n]=n;
    566576
    567577            if(TMath::IsNaN(v[n]))
     
    607617}
    608618
    609 void MRanForest::ModifyDataSort(TArrayI &datsortinbag, Int_t ninbag, const TArrayI &jinbag)
     619// Reoves all indices which are not in the bag from the datsortinbag
     620void MRanForest::ModifyDataSort(MArrayI &datsortinbag, const MArrayI &jinbag)
    610621{
    611622    const Int_t numdim=GetNumDim();
    612623    const Int_t numdata=GetNumData();
    613624
    614     ninbag=0;
     625    Int_t ninbag=0;
    615626    for (Int_t n=0;n<numdata;n++)
    616627        if(jinbag[n]==1) ninbag++;
     
    618629    for(Int_t m=0;m<numdim;m++)
    619630    {
     631        Int_t *subsort = &datsortinbag[m*numdata];
     632
    620633        Int_t k=0;
    621         Int_t nt=0;
    622         for(Int_t n=0;n<numdata;n++)
     634        for(Int_t n=0;n<ninbag;n++)
    623635        {
    624             if(jinbag[datsortinbag[m*numdata+k]]==1)
     636            if(jinbag[subsort[k]]==1)
    625637            {
    626                 datsortinbag[m*numdata+nt]=datsortinbag[m*numdata+k];
     638                subsort[n] = subsort[k];
    627639                k++;
    628640            }else{
    629                 for(Int_t j=1;j<numdata-k;j++)
     641                for(Int_t j=k+1;j<numdata;j++)
    630642                {
    631                     if(jinbag[datsortinbag[m*numdata+k+j]]==1)
     643                    if(jinbag[subsort[j]]==1)
    632644                    {
    633                         datsortinbag[m*numdata+nt]=datsortinbag[m*numdata+k+j];
    634                         k+=j+1;
     645                        subsort[n] = subsort[j];
     646                        k = j+1;
    635647                        break;
    636648                    }
    637649                }
    638650            }
    639             nt++;
    640             if(nt>=ninbag) break;
    641651        }
    642652    }
Note: See TracChangeset for help on using the changeset viewer.