64 fSumOfWeights = -9999;
65 fTransitionPoint = -9999;
84 SetTransitionPoint(evs);
94 auto mapFunc = [&evs](
UInt_t i) {
return evs[i].weight; };
95 auto redFunc = [](
const std::vector<Double_t> &
a) {
return std::accumulate(
a.begin(),
a.end(), 0.0); };
107 for(
UInt_t i = 0; i<evs.size(); i++)
108 sumOfWeights+=evs[i].weight;
124 return TMath::Abs(a.trueValue-a.predictedValue) < TMath::Abs(b.trueValue-b.predictedValue); });
127 return (a.trueValue-a.predictedValue) < (b.trueValue-b.predictedValue); });
130 while(i<evs.size()-1 && temp <= sumOfWeights*whichQuantile){
131 temp += evs[i].weight;
136 if(whichQuantile == 0) i=0;
139 if(abs)
return TMath::Abs(evs[i].trueValue-evs[i].predictedValue);
140 else return evs[i].trueValue-evs[i].predictedValue;
148 fTransitionPoint = CalculateQuantile(evs, fQuantile, fSumOfWeights,
true);
152 if(fTransitionPoint == 0){
154 for(
UInt_t i=0; i<evs.size(); i++){
157 fTransitionPoint = residual;
164 if(fTransitionPoint == 0){
175 fSumOfWeights = CalculateSumOfWeights(evs);
184 if(fSumOfWeights == -9999){
185 std::vector<LossFunctionEventInfo> evs{
e};
186 SetSumOfWeights(evs);
187 SetTransitionPoint(evs);
193 if(residual <= fTransitionPoint) loss = 0.5*residual*residual;
195 else loss = fQuantile*residual - 0.5*fQuantile*fQuantile;
196 return e.weight*loss;
206 SetSumOfWeights(evs);
207 SetTransitionPoint(evs);
210 for(
UInt_t i=0; i<evs.size(); i++)
211 netloss+=CalculateLoss(evs[i]);
224 SetSumOfWeights(evs);
225 SetTransitionPoint(evs);
228 for(
UInt_t i=0; i<evs.size(); i++)
229 netloss+=CalculateLoss(evs[i]);
230 return netloss/fSumOfWeights;
249 std::vector<LossFunctionEventInfo> evinfovec(evinfomap.size());
250 for (
auto &
e: evinfomap){
255 SetSumOfWeights(evinfovec);
256 Double_t weightedMedian = CalculateQuantile(evinfovec, 0.5, fSumOfWeights,
false);
259 boostWeights.push_back(weightedMedian);
260 for (
auto &
e: evinfomap ) {
262 e.second.predictedValue += weightedMedian;
273 std::vector<LossFunctionEventInfo> eventvec(evs.size());
278 auto fcopy = [&eventvec, &evs, &evinfomap](
UInt_t i) {
279 eventvec[i] =
LossFunctionEventInfo(evinfomap[evs[i]].trueValue, evinfomap[evs[i]].predictedValue, evs[i]->GetWeight());
287 SetSumOfWeights(eventvec);
288 SetTransitionPoint(eventvec);
293 const_cast<TMVA::Event*
>(ev)->SetTarget(0, Target(evinfomap[ev]));
303 std::vector<LossFunctionEventInfo> eventvec(evs.size());
304 for (std::vector<const TMVA::Event*>::const_iterator
e=evs.begin();
e!=evs.end();
e++){
305 eventvec.push_back(
LossFunctionEventInfo(evinfomap[*
e].trueValue, evinfomap[*
e].predictedValue, (*e)->GetWeight()));
311 SetSumOfWeights(eventvec);
312 SetTransitionPoint(eventvec);
314 for (std::vector<const TMVA::Event*>::const_iterator
e=evs.begin();
e!=evs.end();
e++) {
324 Double_t residual =
e.trueValue -
e.predictedValue;
326 if(
TMath::Abs(residual) <= fTransitionPoint)
return residual;
327 else return fTransitionPoint*(residual<0?-1.0:1.0);
340 Double_t sumOfWeights = CalculateSumOfWeights(evs);
342 Double_t residualMedian = CalculateQuantile(evs,0.5,sumOfWeights,
false);
343 for(
UInt_t j=0;j<evs.size();j++){
344 Double_t residual = evs[j].trueValue - evs[j].predictedValue;
345 diff = residual-residualMedian;
347 shift+=1.0/evs.size()*((diff<0)?-1.0:1.0)*
TMath::Min(fTransitionPoint,
fabs(diff));
352 return (residualMedian + shift);
369 Double_t residual = (
e.trueValue -
e.predictedValue);
371 loss = residual*residual;
372 return e.weight*loss;
380 for(
UInt_t i=0; i<evs.size(); i++)
381 netloss+=CalculateLoss(evs[i]);
393 for(
UInt_t i=0; i<evs.size(); i++){
394 sumOfWeights+=evs[i].weight;
395 netloss+=CalculateLoss(evs[i]);
398 return netloss/sumOfWeights;
416 std::vector<LossFunctionEventInfo> evinfovec(evinfomap.size());
417 for (
auto &
e: evinfomap){
425 boostWeights.push_back(weightedMean);
426 for (
auto &
e: evinfomap ) {
428 e.second.predictedValue += weightedMean;
441 const_cast<TMVA::Event*
>(ev)->SetTarget(0, Target(evinfomap[ev]));
450 for (std::vector<const TMVA::Event*>::const_iterator
e=evs.begin();
e!=evs.end();
e++) {
460 Double_t residual =
e.trueValue -
e.predictedValue;
474 for(
UInt_t j=0;j<evs.size();j++){
475 sumOfWeights += evs[j].weight;
476 Double_t residual = evs[j].trueValue - evs[j].predictedValue;
477 weightedResidualSum += evs[j].weight*residual;
479 Double_t weightedMean = weightedResidualSum/sumOfWeights;
498 Double_t residual =
e.trueValue -
e.predictedValue;
508 for(
UInt_t i=0; i<evs.size(); i++)
509 netloss+=CalculateLoss(evs[i]);
519 for(
UInt_t i=0; i<evs.size(); i++){
520 sumOfWeights+=evs[i].weight;
521 netloss+=CalculateLoss(evs[i]);
523 return netloss/sumOfWeights;
539 std::vector<LossFunctionEventInfo> evinfovec(evinfomap.size());
540 for (
auto &
e: evinfomap){
547 boostWeights.push_back(weightedMedian);
548 for (
auto &
e: evinfomap ) {
550 e.second.predictedValue += weightedMedian;
562 const_cast<TMVA::Event*
>(ev)->SetTarget(0, Target(evinfomap[ev]));
571 for (std::vector<const TMVA::Event*>::const_iterator
e=evs.begin();
e!=evs.end();
e++) {
582 Double_t residual =
e.trueValue -
e.predictedValue;
584 return (residual<0?-1.0:1.0);
597 return (a.trueValue-a.predictedValue) < (b.trueValue-b.predictedValue); });
601 for(
UInt_t j=0; j<evs.size(); j++)
602 sumOfWeights+=evs[j].weight;
607 while(i<evs.size() && temp <= sumOfWeights*0.5){
608 temp += evs[i].weight;
611 if (i >= evs.size())
return 0.;
614 return evs[i].trueValue-evs[i].predictedValue;
A pseudo container class which is a generator of indices.
Double_t Fit(std::vector< LossFunctionEventInfo > &evs)
absolute deviation BDT, determine the fit value for the terminal node based upon the events in the te...
void SetTargets(std::vector< const TMVA::Event * > &evs, std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap)
absolute deviation BDT, set the targets for a collection of events
void Init(std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap, std::vector< double > &boostWeights)
absolute deviation BDT, initialize the targets and prepare for the regression
Double_t Target(LossFunctionEventInfo &e)
absolute deviation BDT, set the target for a single event
Double_t CalculateNetLoss(std::vector< LossFunctionEventInfo > &evs)
absolute deviation, determine the net loss for a collection of events
Double_t CalculateMeanLoss(std::vector< LossFunctionEventInfo > &evs)
absolute deviation, determine the mean loss for a collection of events
Double_t CalculateLoss(LossFunctionEventInfo &e)
absolute deviation, determine the loss for a single event
Executor & GetThreadExecutor()
Get executor class for multi-thread usage In case when MT is not enabled will return a serial executo...
static Config & Instance()
static function: returns TMVA instance
void SetTarget(UInt_t itgt, Float_t value)
set the target value (dimension itgt) to value
void Foreach(Function func, unsigned int nTimes, unsigned nChunks=0)
wrap TExecutor::Foreach
unsigned int GetPoolSize() const
auto MapReduce(F func, ROOT::TSeq< INTEGER > args, R redfunc) -> typename std::result_of< F(INTEGER)>::type
Wrap TExecutor::MapReduce functions.
Double_t Target(LossFunctionEventInfo &e)
huber BDT, set the target for a single event
Double_t Fit(std::vector< LossFunctionEventInfo > &evs)
huber BDT, determine the fit value for the terminal node based upon the events in the terminal node
void Init(std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap, std::vector< double > &boostWeights)
huber BDT, initialize the targets and prepare for the regression
void SetTargets(std::vector< const TMVA::Event * > &evs, std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap)
huber BDT, set the targets for a collection of events
HuberLossFunction()
huber constructor
void SetSumOfWeights(std::vector< LossFunctionEventInfo > &evs)
huber, set the sum of weights given a collection of events
void SetTransitionPoint(std::vector< LossFunctionEventInfo > &evs)
huber, determine the transition point using the values for fQuantile and fSumOfWeights which presumab...
Double_t CalculateNetLoss(std::vector< LossFunctionEventInfo > &evs)
huber, determine the net loss for a collection of events
Double_t CalculateLoss(LossFunctionEventInfo &e)
huber, determine the loss for a single event
~HuberLossFunction()
huber destructor
Double_t fTransitionPoint
Double_t CalculateSumOfWeights(const std::vector< LossFunctionEventInfo > &evs)
huber, calculate the sum of weights for the events in the vector
Double_t CalculateMeanLoss(std::vector< LossFunctionEventInfo > &evs)
huber, determine the mean loss for a collection of events
void Init(std::vector< LossFunctionEventInfo > &evs)
figure out the residual that determines the separation between the "core" and the "tails" of the resi...
Double_t CalculateQuantile(std::vector< LossFunctionEventInfo > &evs, Double_t whichQuantile, Double_t sumOfWeights, bool abs)
huber, determine the quantile for a given input
void SetTargets(std::vector< const TMVA::Event * > &evs, std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap)
least squares BDT, set the targets for a collection of events
Double_t Target(LossFunctionEventInfo &e)
least squares BDT, set the target for a single event
Double_t Fit(std::vector< LossFunctionEventInfo > &evs)
huber BDT, determine the fit value for the terminal node based upon the events in the terminal node
void Init(std::map< const TMVA::Event *, LossFunctionEventInfo > &evinfomap, std::vector< double > &boostWeights)
least squares BDT, initialize the targets and prepare for the regression
Double_t CalculateNetLoss(std::vector< LossFunctionEventInfo > &evs)
least squares , determine the net loss for a collection of events
Double_t CalculateMeanLoss(std::vector< LossFunctionEventInfo > &evs)
least squares , determine the mean loss for a collection of events
Double_t CalculateLoss(LossFunctionEventInfo &e)
least squares , determine the loss for a single event
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
Short_t Min(Short_t a, Short_t b)