Пример #1
0
/*  Cette fonction revoie vrai si l'objet pixel sur lequel est appelé cette fonction
 *  est dans le meme ensemble que celui en paramètre
 */
bool Pixel::dans_Meme_Ensemble(Pixel* autre_Pixel){

    Pixel* Mon_representant = getEnsemble()->getHead();

    Pixel* Son_representant = autre_Pixel->getEnsemble()->getHead();
    return Mon_representant == Son_representant;

}
Пример #2
0
void ConfigurationDefault::updateParameters(const std::vector<Obs>& iObs, int iDate, int iInit, float iOffset, int iPoolId, const std::string& iVariable, int iDateGet, int iDateSet, float iOffsetGet, float iOffsetSet) {
   const std::vector<Obs>& useObs = iObs;
   int dateFcst = iDate;
   float offset = iOffset;
   int poolId   = iPoolId;
   iDate = iDateGet;

   bool needEnsemble = getNeedEnsemble();

   // Check that we are updating the right forecast
   for(int k = 0; k < useObs.size(); k++) {
      Obs obs = useObs[k];
      assert(Global::getDate(obs.getDate(), obs.getInit(), obs.getOffset()) == Global::getDate(dateFcst, iInit, offset) &&
            Global::getTime(obs.getDate(), obs.getInit(), obs.getOffset()) == Global::getTime(dateFcst, iInit, offset));
   }
   // Selector
   if(mSelector->needsTraining()) {
      Parameters par;
      getParameters(Processor::TypeSelector, iDate, iInit, iOffsetGet, poolId, iVariable, 0, par);
      // Create vector date and offsets for selector's update parameters
      std::vector<int> fcstDates(iObs.size(), iDate);
      std::vector<float> fcstOffsets(iObs.size(), iOffset);
      mSelector->updateParameters(fcstDates, iInit, fcstOffsets, useObs, par);
      setParameters(Processor::TypeSelector, iDate, iInit, iOffsetSet, poolId, iVariable, 0, par);
   }

   if(needEnsemble) {
      // Correctors
      std::vector<Ensemble> ensembles;
      for(int n = 0; n < useObs.size(); n++) {
         Location obsLocation = useObs[n].getLocation();
         // Get the raw ensemble
         Ensemble ensemble;
         getEnsemble(dateFcst, iInit, offset, obsLocation, iVariable, ensemble, typeUnCorrected);
         ensembles.push_back(ensemble);
      }
      for(int k = 0; k < (int) mCorrectors.size(); k++) {
         Parameters parCorrector;
         getParameters(Processor::TypeCorrector, iDate, iInit, iOffsetGet, poolId, iVariable, k, parCorrector);
         Parameters parOrig = parCorrector;
         if(mCorrectors[k]->needsTraining()) {
            mCorrectors[k]->updateParameters(ensembles, useObs, parCorrector);
            setParameters(Processor::TypeCorrector, iDate, iInit, iOffsetSet, poolId, iVariable, k, parCorrector);
         }

         // Correct ensemble for next corrector
         for(int n = 0; n < ensembles.size(); n++) {
            mCorrectors[k]->correct(parOrig, ensembles[n]);
         }
      }

      // Uncertainty
      Parameters parUncertainty;
      getParameters(Processor::TypeUncertainty, iDate, iInit, iOffsetGet, poolId, iVariable, 0, parUncertainty);
      Parameters parAverager;
      getParameters(Processor::TypeAverager, iDate, iInit, iOffsetGet, poolId, iVariable, 0, parAverager);
      if(mUncertainty->needsTraining()) {
         mUncertainty->updateParameters(ensembles, useObs, parUncertainty);
         setParameters(Processor::TypeUncertainty, iDate, iInit, iOffsetSet, poolId, iVariable, 0, parUncertainty);
      }

      // Calibrators
      if(mAverager->needsTraining() || mCalibrators.size() > 0 || mUpdaters.size() > 0) {
         std::vector<std::vector<Distribution::ptr> > upstreams;
         upstreams.resize(1 + mCalibrators.size() + mUpdaters.size());
         upstreams[0].resize(useObs.size());
         for(int n = 0; n < useObs.size(); n++) {
            Distribution::ptr uncD = mUncertainty->getDistribution(ensembles[n], parUncertainty, *mAverager, parAverager);
            upstreams[0][n] = uncD;
         }

         // Start with the uncertainty distributions. Then iteratively calibrate the previous
         // distirbution (upstream).
         int Iupstream = 0;
         for(int k = 0; k < (int) mCalibrators.size(); k++) {
            upstreams[Iupstream+1].resize(useObs.size());
            Parameters parCalibrator;
            getParameters(Processor::TypeCalibrator, iDate, iInit, iOffsetGet, poolId, iVariable, k, parCalibrator);
            if(mCalibrators[k]->needsTraining()) {
               mCalibrators[k]->updateParameters(upstreams[Iupstream], useObs, parCalibrator);
               setParameters(Processor::TypeCalibrator, iDate, iInit, iOffsetSet, poolId, iVariable, k, parCalibrator);
            }
            // Calibrate all distributions for the next calibrator
            for(int n = 0; n < useObs.size(); n++) {
               upstreams[Iupstream+1][n] = mCalibrators[k]->getDistribution(upstreams[Iupstream][n], parCalibrator);
            }
            Iupstream++;
         }
         // Updaters
         if(mUpdaters.size() > 0) {
            assert(mUpdaters.size() <= 1);
            std::vector<Distribution::ptr> recentDists(useObs.size());
            std::vector<Obs> recentObs;
            for(int n = 0; n < useObs.size(); n++) {
               Distribution::ptr recentDist = getDistribution(dateFcst, iInit, 0, useObs[n].getLocation(), iVariable, typeUnUpdated);
               recentDists[n] = recentDist;
               // Get the recent most observation
               Obs obs;
               mData.getObs(dateFcst, iInit, 0, useObs[n].getLocation(), iVariable, obs);
               recentObs.push_back(obs);
            }
            for(int k = 0; k < mUpdaters.size(); k++) {
               upstreams[Iupstream+1].resize(useObs.size());
               Parameters par;
               getParameters(Processor::TypeUpdater, iDate, iInit, iOffsetGet, poolId, iVariable, k, par);
               if(mUpdaters[k]->needsTraining()) {
                  mUpdaters[k]->updateParameters(upstreams[Iupstream], useObs, recentDists, recentObs, par);
                  setParameters(Processor::TypeUpdater, iDate, iInit, iOffsetSet, poolId, iVariable, k, par);
               }
               Iupstream++;
            }
         }
         // Averager
         if(mAverager->needsTraining()) {
            Parameters parAverager;
            getParameters(Processor::TypeAverager, iDate, iInit, iOffsetGet, poolId, iVariable, 0, parAverager);
            mAverager->updateParameters(upstreams[upstreams.size()-1], useObs, parAverager);
            setParameters(Processor::TypeAverager, iDate, iInit, iOffsetSet, poolId, iVariable, 0, parAverager);
         }
      }
   }
}
Пример #3
0
Distribution::ptr ConfigurationDefault::getDistribution(int iDate,
      int iInit,
      float iOffset,
      const Location& iLocation,
      std::string iVariable,
      ProcTypeDist iType) const {

   float offsetCode   = mPooler->find(iOffset);

   Ensemble ens;
   getEnsemble(iDate, iInit, iOffset, iLocation, iVariable, ens);

   /////////////////
   // Uncertainty //
   /////////////////
   Parameters parUnc;
   getParameters(Processor::TypeUncertainty, iDate, iInit, offsetCode, iLocation, iVariable, 0, parUnc);
   Parameters parAverager;
   getParameters(Processor::TypeAverager, iDate, iInit, offsetCode, iLocation, iVariable, 0, parAverager);
   Distribution::ptr uncD = mUncertainty->getDistribution(ens, parUnc, *mAverager, parAverager);

   if(mCalibrators.size() == 0 && mUpdaters.size() == 0)
      return uncD;

   if(iType == typeUnCalibrated)
      return uncD;
   
   /////////////////
   // Calibration //
   /////////////////
   std::vector<Distribution::ptr> cal;
   cal.push_back(uncD);

   // Chain calibrators together
   for(int i = 0; i < (int) mCalibrators.size(); i++) {
      Parameters parCal;
      getParameters(Processor::TypeCalibrator, iDate, iInit, offsetCode, iLocation, iVariable, i, parCal);

      cal.push_back(mCalibrators[i]->getDistribution(cal[i], parCal));
   }

   if(iType == typeUnUpdated)
      return cal.back();

   //////////////
   // Updating //
   //////////////
   for(int i = 0; i < (int) mUpdaters.size(); i++) {
      Parameters par;
      Obs recentObs;
      mData.getObs(iDate, iInit, 0, iLocation, iVariable, recentObs);
      Distribution::ptr recentDist = getDistribution(iDate, iInit, 0, iLocation, iVariable, typeUnUpdated);
      getParameters(Processor::TypeUpdater, iDate, iInit, offsetCode, iLocation, iVariable, i, par);

      int Iupstream = cal.size()-1;
      assert(Iupstream >= 0);

      Distribution::ptr dist = mUpdaters[i]->getDistribution(cal[Iupstream], recentObs, recentDist, par);
      cal.push_back(dist);
   }
   return cal.back();
}
Пример #4
0
void ClassificationTree::optSplitPos(int &nOptFeatureIndex,
            float &fOptFeatureVal,
            std::vector<int32_t> &vCurrentIndex,
            std::vector<int32_t> &vFeatureIndex) {	
    
	float minDevia = INT_MAX;

	// sample the feature
	std::vector<int32_t> vTempFeatureIndex;

	if (getEnsemble()) {
		srand( (unsigned)time(NULL));
		for (int32_t i = 0; i < vFeatureIndex.size(); ++i) {
			int32_t t = rand() % vFeatureIndex.size();
			std::swap(vFeatureIndex[i], vFeatureIndex[t]);
		}
		vTempFeatureIndex.assign(vFeatureIndex.begin(),	vFeatureIndex.begin() + getRandFeatureCnt());
	} else {
		vTempFeatureIndex.assign(vFeatureIndex.begin(), vFeatureIndex.end());
	}

	// gini data
	int32_t totLabelCnt = vCurrentIndex.size();

	for (int i = 0; i < vTempFeatureIndex.size(); ++i) {

		std::set<int32_t> featureValueSet;
		std::map<int32_t, int32_t> featureValCnt;
		
		std::vector<int32_t> labelCnt(getLabelCnt(), 0);
		std::map<int32_t, std::vector<int32_t> > featureLabelCnt;

		for (int j = 0; j < vCurrentIndex.size(); ++j) {
			
			int32_t val = (int32_t)getTrainingX()[vCurrentIndex[j]][vTempFeatureIndex[i]];
			int32_t label = (int32_t)getTrainingY()[vCurrentIndex[j]];

			featureValueSet.insert(val);

			if (featureValCnt.find(val) == featureValCnt.end()) {
			
				featureValCnt[val] = 1;
				std::vector<int32_t> t(getLabelCnt(), 0);
				featureLabelCnt[val] = t;
				featureLabelCnt[val][label] += 1;
			
			} else {
			
				featureValCnt[val] += 1;
				featureLabelCnt[val][label] += 1;
			
			}

			labelCnt[label] += 1;
		}	
		
		for (std::set<int32_t>::iterator it = featureValueSet.begin(); it != featureValueSet.end(); ++it) {
			int32_t val = *it;
			int cnt = featureValCnt[val];
			
			std::vector<int32_t> labelNum = featureLabelCnt[val];
			float gini = 0.0;
			float rTot = 0.0;
			float lTot = 0.0;
			for (int32_t k = 0; k < getLabelCnt(); ++k) {

				lTot += labelNum[k] * labelNum[k] * 1.0 / (cnt * cnt);
				rTot += (labelCnt[k] - labelNum[k]) * (labelCnt[k] - labelNum[k]) * 1.0 /
						((totLabelCnt - cnt) * (totLabelCnt - cnt));
			
			}
			gini = (1 - lTot) * cnt * 1.0 + (1 - rTot) * (totLabelCnt - cnt) * 1.0;
			gini = gini / totLabelCnt;
			if (gini < minDevia) {
				gini = minDevia;
				fOptFeatureVal = val;
				nOptFeatureIndex = vTempFeatureIndex[i];
			}
		}
	}	
}
Пример #5
0
Pixel* Pixel:: getHead() {
    return getEnsemble()->getHead();

}//Recuperer le representant dun ensemble, findSet