102   if(DataInfo().GetNTargets()!=0) fNRegOut = DataInfo().GetNTargets();
 
  107      (*fLDCoeff)[
iout] = 
new std::vector<Double_t>( GetNvar()+1 );
 
  111   SetSignalReferenceCut( 0.0 );
 
 
  119   if (fSumMatx)    { 
delete fSumMatx;    fSumMatx    = 0; }
 
  120   if (fSumValMatx) { 
delete fSumValMatx; fSumValMatx = 0; }
 
  121   if (fCoeffMatx)  { 
delete fCoeffMatx;  fCoeffMatx  = 0; }
 
  123      for (vector< vector< Double_t >* >::iterator 
vi=fLDCoeff->
begin(); 
vi!=fLDCoeff->
end(); ++
vi){
 
  124         if (*
vi) { 
delete *
vi; *
vi = 0; }
 
  126      delete fLDCoeff; fLDCoeff = 0;
 
 
  170   if (fRegressionReturnVal == 
NULL) fRegressionReturnVal = 
new vector< Float_t >();
 
  171   fRegressionReturnVal->resize( fNRegOut );
 
  174      (*fRegressionReturnVal)[
iout] = (*(*fLDCoeff)[
iout])[0] ;
 
  177      for (
auto const& val : 
ev->GetValues()) {
 
  178         (*fRegressionReturnVal)[
iout] += (*(*fLDCoeff)[
iout])[++
icoeff] * val;
 
  185   return (*fRegressionReturnVal)[0];
 
 
  195   if (fRegressionReturnVal == 
NULL) fRegressionReturnVal = 
new vector< Float_t >();
 
  196   fRegressionReturnVal->resize( fNRegOut );
 
  199      (*fRegressionReturnVal)[
iout] = (*(*fLDCoeff)[
iout])[0] ;
 
  202      for (
auto const& val : 
ev->GetValues()) {
 
  203         (*fRegressionReturnVal)[
iout] += (*(*fLDCoeff)[
iout])[++
icoeff] * val;
 
  211   const Event* 
evT2 = GetTransformationHandler().InverseTransform( 
evT );
 
  212   fRegressionReturnVal->clear();
 
  216   return (*fRegressionReturnVal);
 
 
  224   fSumMatx    = 
new TMatrixD( GetNvar()+1, GetNvar()+1 );
 
  225   fSumValMatx = 
new TMatrixD( GetNvar()+1, fNRegOut );
 
  226   fCoeffMatx  = 
new TMatrixD( GetNvar()+1, fNRegOut );
 
 
  236   const UInt_t nvar = DataInfo().GetNVariables();
 
  248      if (IgnoreEventsWithNegWeightsInTraining() && weight <= 0) 
continue;
 
  251      (*fSumMatx)( 0, 0 ) += weight;
 
  255         (*fSumMatx)( 
ivar+1, 0 ) += 
ev->GetValue( 
ivar ) * weight;
 
  256         (*fSumMatx)( 0, 
ivar+1 ) += 
ev->GetValue( 
ivar ) * weight;
 
 
  273   const UInt_t nvar = DataInfo().GetNVariables();
 
  289      if (IgnoreEventsWithNegWeightsInTraining() && weight <= 0) 
continue;
 
  295         if (!DoRegression()){
 
  296            val *= DataInfo().IsSignal(
ev); 
 
  298            val *= 
ev->GetTarget( 
ivar );
 
  300         (*fSumValMatx)( 0,
ivar ) += val;
 
 
  313   const UInt_t nvar = DataInfo().GetNVariables();
 
  318         Log() << kWARNING << 
"<GetCoeff> matrix is almost singular with determinant=" 
  320               << 
" did you use the variables that are linear combinations or highly correlated?" 
  324         Log() << kFATAL << 
"<GetCoeff> matrix is singular with determinant=" 
  326               << 
" did you use the variables that are linear combinations?" 
  335      if (!DoRegression()) {
 
  336         (*(*fLDCoeff)[
ivar])[0]=0.0;
 
  338            (*(*fLDCoeff)[
ivar])[0]+=(*fCoeffMatx)(
jvar,
ivar)*(*fSumMatx)(0,
jvar)/(*fSumMatx)( 0, 0 );
 
  340         (*(*fLDCoeff)[
ivar])[0]/=-2.0;
 
 
  387   if (
ncoeff != GetNvar()+1) Log() << kFATAL << 
"Mismatch in number of output variables/coefficients: " 
  392      for (vector< vector< Double_t >* >::iterator 
vi=fLDCoeff->
begin(); 
vi!=fLDCoeff->
end(); ++
vi){
 
  393         if (*
vi) { 
delete *
vi; *
vi = 0; }
 
  395      delete fLDCoeff; fLDCoeff = 0;
 
 
  419   fout << 
"   std::vector<double> fLDCoefficients;" << std::endl;
 
  420   fout << 
"};" << std::endl;
 
  421   fout << 
"" << std::endl;
 
  422   fout << 
"inline void " << className << 
"::Initialize() " << std::endl;
 
  423   fout << 
"{" << std::endl;
 
  426      fout << 
"   fLDCoefficients.push_back( " 
  427           << std::setprecision(12) << (*(*fLDCoeff)[0])[
ivar]
 
  428           << std::setprecision(
dp) << 
" );" << std::endl;
 
  431   fout << 
"   // sanity check" << std::endl;
 
  432   fout << 
"   if (fLDCoefficients.size() != fNvars+1) {" << std::endl;
 
  433   fout << 
"      std::cout << \"Problem in class \\\"\" << fClassName << \"\\\"::Initialize: mismatch in number of input values\"" << std::endl;
 
  434   fout << 
"                << fLDCoefficients.size() << \" != \" << fNvars+1 << std::endl;" << std::endl;
 
  435   fout << 
"      fStatusIsClean = false;" << std::endl;
 
  436   fout << 
"   }         " << std::endl;
 
  437   fout << 
"}" << std::endl;
 
  439   fout << 
"inline double " << className << 
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
 
  440   fout << 
"{" << std::endl;
 
  441   fout << 
"   double retval = fLDCoefficients[0];" << std::endl;
 
  442   fout << 
"   for (size_t ivar = 1; ivar < fNvars+1; ivar++) {" << std::endl;
 
  443   fout << 
"      retval += fLDCoefficients[ivar]*inputValues[ivar-1];" << std::endl;
 
  444   fout << 
"   }" << std::endl;
 
  446   fout << 
"   return retval;" << std::endl;
 
  447   fout << 
"}" << std::endl;
 
  449   fout << 
"// Clean up" << std::endl;
 
  450   fout << 
"inline void " << className << 
"::Clear() " << std::endl;
 
  451   fout << 
"{" << std::endl;
 
  452   fout << 
"   // clear coefficients" << std::endl;
 
  453   fout << 
"   fLDCoefficients.clear(); " << std::endl;
 
  454   fout << 
"}" << std::endl;
 
 
  462   fRanking = 
new Ranking( GetName(), 
"Discr. power" );
 
 
  484   if (HasTrainingTree()) InitMatrices();
 
 
  492   Log() << kHEADER << 
"Results for LD coefficients:" << 
Endl;
 
  494   if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
 
  495      Log() << kINFO << 
"NOTE: The coefficients must be applied to TRANFORMED variables" << 
Endl;
 
  496      Log() << kINFO << 
"      List of the transformation: " << 
Endl;
 
  497      TListIter trIt(&GetTransformationHandler().GetTransformationList());
 
  499         Log() << kINFO << 
"  -- " << 
trf->GetName() << 
Endl;
 
  502   std::vector<TString>  vars;
 
  503   std::vector<Double_t> 
coeffs;
 
  505      vars  .push_back( GetInputLabel(
ivar) );
 
  506      coeffs.push_back( (* (*fLDCoeff)[0])[
ivar+1] );
 
  508   vars  .push_back( 
"(offset)" );
 
  509   coeffs.push_back((* (*fLDCoeff)[0])[0] );
 
  511   if (IsNormalised()) {
 
  512      Log() << kINFO << 
"NOTE: You have chosen to use the \"Normalise\" booking option. Hence, the" << 
Endl;
 
  513      Log() << kINFO << 
"      coefficients must be applied to NORMALISED (') variables as follows:" << 
Endl;
 
  520               << std::setw(
maxL+9) << 
TString(
"[") + GetInputLabel(
ivar) + 
"]' = 2*(" 
  522               << std::setw(3) << (GetXmin(
ivar) > 0 ? 
" - " : 
" + ")
 
  523               << std::setw(6) << 
TMath::Abs(GetXmin(
ivar)) << std::setw(3) << 
")/" 
  524               << std::setw(6) << (GetXmax(
ivar) -  GetXmin(
ivar) )
 
  525               << std::setw(3) << 
" - 1" 
  528      Log() << kINFO << 
"The TMVA Reader will properly account for this normalisation, but if the" << 
Endl;
 
  529      Log() << kINFO << 
"LD classifier is applied outside the Reader, the transformation must be" << 
Endl;
 
  530      Log() << kINFO << 
"implemented -- or the \"Normalise\" option is removed and LD retrained." << 
Endl;
 
  531      Log() << kINFO << 
Endl;
 
 
  546   Log() << 
"Linear discriminants select events by distinguishing the mean " << 
Endl;
 
  547   Log() << 
"values of the signal and background distributions in a trans- " << 
Endl;
 
  548   Log() << 
"formed variable space where linear correlations are removed." << 
Endl;
 
  549   Log() << 
"The LD implementation here is equivalent to the \"Fisher\" discriminant" << 
Endl;
 
  550   Log() << 
"for classification, but also provides linear regression." << 
Endl;
 
  552   Log() << 
"   (More precisely: the \"linear discriminator\" determines" << 
Endl;
 
  553   Log() << 
"    an axis in the (correlated) hyperspace of the input " << 
Endl;
 
  554   Log() << 
"    variables such that, when projecting the output classes " << 
Endl;
 
  555   Log() << 
"    (signal and background) upon this axis, they are pushed " << 
Endl;
 
  556   Log() << 
"    as far as possible away from each other, while events" << 
Endl;
 
  557   Log() << 
"    of a same class are confined in a close vicinity. The  " << 
Endl;
 
  558   Log() << 
"    linearity property of this classifier is reflected in the " << 
Endl;
 
  559   Log() << 
"    metric with which \"far apart\" and \"close vicinity\" are " << 
Endl;
 
  560   Log() << 
"    determined: the covariance matrix of the discriminating" << 
Endl;
 
  561   Log() << 
"    variable space.)" << 
Endl;
 
  565   Log() << 
"Optimal performance for the linear discriminant is obtained for " << 
Endl;
 
  566   Log() << 
"linearly correlated Gaussian-distributed variables. Any deviation" << 
Endl;
 
  567   Log() << 
"from this ideal reduces the achievable separation power. In " << 
Endl;
 
  568   Log() << 
"particular, no discrimination at all is achieved for a variable" << 
Endl;
 
  569   Log() << 
"that has the same sample mean for signal and background, even if " << 
Endl;
 
  570   Log() << 
"the shapes of the distributions are very different. Thus, the linear " << 
Endl;
 
  571   Log() << 
"discriminant often benefits from a suitable transformation of the " << 
Endl;
 
  572   Log() << 
"input variables. For example, if a variable x in [-1,1] has a " << 
Endl;
 
  573   Log() << 
"a parabolic signal distributions, and a uniform background" << 
Endl;
 
  574   Log() << 
"distributions, their mean value is zero in both cases, leading " << 
Endl;
 
  575   Log() << 
"to no separation. The simple transformation x -> |x| renders this " << 
Endl;
 
  576   Log() << 
"variable powerful for the use in a linear discriminant." << 
Endl;
 
  580   Log() << 
"<None>" << 
Endl;
 
 
#define REGISTER_METHOD(CLASS)
for example
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
TMatrixT< Double_t > TMatrixD
 
const_iterator begin() const
 
const_iterator end() const
 
Class that contains all the data information.
 
Virtual base Class for all MVA method.
 
void GetSum(void)
Calculates the matrix transposed(X)*W*X with W being the diagonal weight matrix and X the coordinates...
 
void GetHelpMessage() const
get help message text
 
Double_t GetMvaValue(Double_t *err=nullptr, Double_t *errUpper=nullptr)
Returns the MVA classification output.
 
const Ranking * CreateRanking()
computes ranking of input variables
 
Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)
LD can handle classification with 2 classes and regression with one regression-target.
 
MethodLD(const TString &jobName, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="LD")
standard constructor for the LD
 
void DeclareOptions()
MethodLD options.
 
void GetLDCoeff(void)
Calculates the coefficients used for classification/regression.
 
virtual const std::vector< Float_t > & GetRegressionValues()
Calculates the regression output.
 
void ReadWeightsFromStream(std::istream &i)
read LD coefficients from weight file
 
void ReadWeightsFromXML(void *wghtnode)
read coefficients from xml weight file
 
void Init(void)
default initialization called by all constructors
 
void ProcessOptions()
this is the preparation for training
 
void PrintCoefficients(void)
Display the classification/regression coefficients for each variable.
 
void Train(void)
compute fSumMatx
 
virtual ~MethodLD(void)
destructor
 
void AddWeightsXMLTo(void *parent) const
create XML description for LD classification and regression (for arbitrary number of output classes/t...
 
void MakeClassSpecific(std::ostream &, const TString &) const
write LD-specific classifier response
 
void InitMatrices(void)
Initialization method; creates global matrices and vectors.
 
void GetSumVal(void)
Calculates the vector transposed(X)*W*Y with Y being the target vector.
 
Ranking for variables in method (implementation)
 
Singleton class for Global types used by TMVA.
 
MsgLogger & Endl(MsgLogger &ml)
 
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.