141   fFisherMethod ( kFisher ),
 
 
  160   fTheMethod    ( 
"Fisher" ),
 
  161   fFisherMethod ( kFisher ),
 
 
  179   fFisherCoeff = 
new std::vector<Double_t>( GetNvar() );
 
  182   SetSignalReferenceCut( 0.0 );
 
 
  195   DeclareOptionRef( fTheMethod = 
"Fisher", 
"Method", 
"Discrimination method" );
 
  196   AddPreDefVal(
TString(
"Fisher"));
 
  197   AddPreDefVal(
TString(
"Mahalanobis"));
 
 
  205   if (fTheMethod ==  
"Fisher" ) fFisherMethod = kFisher;
 
  206   else                          fFisherMethod = kMahalanobis;
 
 
  217   if (fBetw       ) { 
delete fBetw; fBetw = 0; }
 
  218   if (fWith       ) { 
delete fWith; fWith = 0; }
 
  219   if (fCov        ) { 
delete fCov;  fCov = 0; }
 
  220   if (fDiscrimPow ) { 
delete fDiscrimPow; fDiscrimPow = 0; }
 
  221   if (fFisherCoeff) { 
delete fFisherCoeff; fFisherCoeff = 0; }
 
 
  242   GetCov_WithinClass();
 
  245   GetCov_BetweenClass();
 
 
  287   fMeanMatx = 
new TMatrixD( GetNvar(), 3 );
 
  290   fBetw = 
new TMatrixD( GetNvar(), GetNvar() );
 
  291   fWith = 
new TMatrixD( GetNvar(), GetNvar() );
 
  292   fCov  = 
new TMatrixD( GetNvar(), GetNvar() );
 
  295   fDiscrimPow = 
new std::vector<Double_t>( GetNvar() );
 
 
  307   const UInt_t nvar = DataInfo().GetNVariables();
 
  322      if (DataInfo().IsSignal(
ev)) fSumOfWeightsS += weight;
 
  323      else                         fSumOfWeightsB += weight;
 
  338      (*fMeanMatx)( 
ivar, 2 ) /= (fSumOfWeightsS + fSumOfWeightsB);
 
 
  353   assert( fSumOfWeightsS > 0 && fSumOfWeightsB > 0 );
 
  358   const Int_t nvar  = GetNvar();
 
  378            if (DataInfo().IsSignal(
ev)) {
 
  401         (*fWith)(
x, 
y) = 
sumSig[k]/fSumOfWeightsS + 
sumBgd[k]/fSumOfWeightsB;
 
 
  419   assert( fSumOfWeightsS > 0 && fSumOfWeightsB > 0);
 
  426         prodSig = ( ((*fMeanMatx)(
x, 0) - (*fMeanMatx)(
x, 2))*
 
  427                     ((*fMeanMatx)(
y, 0) - (*fMeanMatx)(
y, 2)) );
 
  428         prodBgd = ( ((*fMeanMatx)(
x, 1) - (*fMeanMatx)(
x, 2))*
 
  429                     ((*fMeanMatx)(
y, 1) - (*fMeanMatx)(
y, 2)) );
 
  431         (*fBetw)(
x, 
y) = (fSumOfWeightsS*
prodSig + fSumOfWeightsB*
prodBgd) / (fSumOfWeightsS + fSumOfWeightsB);
 
 
  443         (*fCov)(
x, 
y) = (*fWith)(
x, 
y) + (*fBetw)(
x, 
y);
 
 
  459   assert( fSumOfWeightsS > 0 && fSumOfWeightsB > 0);
 
  463   switch (GetFisherMethod()) {
 
  471      Log() << kFATAL << 
"<GetFisherCoeff> undefined method" << GetFisherMethod() << 
Endl;
 
  477      Log() << kWARNING << 
"<GetFisherCoeff> matrix is almost singular with determinant=" 
  479            << 
" did you use the variables that are linear combinations or highly correlated?" 
  484      Log() << kFATAL << 
"<GetFisherCoeff> matrix is singular with determinant=" 
  486            << 
" did you use the variables that are linear combinations? \n" 
  487            << 
" do you any clue as to what went wrong in above printout of the covariance matrix? " 
  497   std::vector<Double_t> 
diffMeans( GetNvar() );
 
  500      (*fFisherCoeff)[
ivar] = 0;
 
  514      fF0 += (*fFisherCoeff)[
ivar]*((*fMeanMatx)(
ivar, 0) + (*fMeanMatx)(
ivar, 1));
 
 
  533         (*fDiscrimPow)[
ivar] = 0;
 
 
  543   fRanking = 
new Ranking( GetName(), 
"Discr. power" );
 
  546      fRanking->AddRank( 
Rank( GetInputLabel(
ivar), (*fDiscrimPow)[
ivar] ) );
 
 
  558   Log() << kHEADER << 
"Results for Fisher coefficients:" << 
Endl;
 
  560   if (GetTransformationHandler().GetTransformationList().GetSize() != 0) {
 
  561      Log() << kINFO << 
"NOTE: The coefficients must be applied to TRANFORMED variables" << 
Endl;
 
  562      Log() << kINFO << 
"  List of the transformation: " << 
Endl;
 
  563      TListIter trIt(&GetTransformationHandler().GetTransformationList());
 
  565         Log() << kINFO << 
"  -- " << 
trf->GetName() << 
Endl;
 
  568   std::vector<TString>  vars;
 
  569   std::vector<Double_t> 
coeffs;
 
  571      vars  .push_back( GetInputLabel(
ivar) );
 
  574   vars  .push_back( 
"(offset)" );
 
  581   if (IsNormalised()) {
 
  582      Log() << kINFO << 
"NOTE: You have chosen to use the \"Normalise\" booking option. Hence, the" << 
Endl;
 
  583      Log() << kINFO << 
"      coefficients must be applied to NORMALISED (') variables as follows:" << 
Endl;
 
  590               << std::setw(
maxL+9) << 
TString(
"[") + GetInputLabel(
ivar) + 
"]' = 2*(" 
  592               << std::setw(3) << (GetXmin(
ivar) > 0 ? 
" - " : 
" + ")
 
  593               << std::setw(6) << 
TMath::Abs(GetXmin(
ivar)) << std::setw(3) << 
")/" 
  594               << std::setw(6) << (GetXmax(
ivar) -  GetXmin(
ivar) )
 
  595               << std::setw(3) << 
" - 1" 
  598      Log() << kINFO << 
"The TMVA Reader will properly account for this normalisation, but if the" << 
Endl;
 
  599      Log() << kINFO << 
"Fisher classifier is applied outside the Reader, the transformation must be" << 
Endl;
 
  600      Log() << kINFO << 
"implemented -- or the \"Normalise\" option is removed and Fisher retrained." << 
Endl;
 
  601      Log() << kINFO << 
Endl;
 
 
  638   fFisherCoeff->resize(
ncoeff-1);
 
 
  657   fout << 
"   double              fFisher0;" << std::endl;
 
  658   fout << 
"   std::vector<double> fFisherCoefficients;" << std::endl;
 
  659   fout << 
"};" << std::endl;
 
  660   fout << 
"" << std::endl;
 
  661   fout << 
"inline void " << className << 
"::Initialize() " << std::endl;
 
  662   fout << 
"{" << std::endl;
 
  663   fout << 
"   fFisher0 = " << std::setprecision(12) << fF0 << 
";" << std::endl;
 
  665      fout << 
"   fFisherCoefficients.push_back( " << std::setprecision(12) << (*fFisherCoeff)[
ivar] << 
" );" << std::endl;
 
  668   fout << 
"   // sanity check" << std::endl;
 
  669   fout << 
"   if (fFisherCoefficients.size() != fNvars) {" << std::endl;
 
  670   fout << 
"      std::cout << \"Problem in class \\\"\" << fClassName << \"\\\"::Initialize: mismatch in number of input values\"" << std::endl;
 
  671   fout << 
"                << fFisherCoefficients.size() << \" != \" << fNvars << std::endl;" << std::endl;
 
  672   fout << 
"      fStatusIsClean = false;" << std::endl;
 
  673   fout << 
"   }         " << std::endl;
 
  674   fout << 
"}" << std::endl;
 
  676   fout << 
"inline double " << className << 
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
 
  677   fout << 
"{" << std::endl;
 
  678   fout << 
"   double retval = fFisher0;" << std::endl;
 
  679   fout << 
"   for (size_t ivar = 0; ivar < fNvars; ivar++) {" << std::endl;
 
  680   fout << 
"      retval += fFisherCoefficients[ivar]*inputValues[ivar];" << std::endl;
 
  681   fout << 
"   }" << std::endl;
 
  683   fout << 
"   return retval;" << std::endl;
 
  684   fout << 
"}" << std::endl;
 
  686   fout << 
"// Clean up" << std::endl;
 
  687   fout << 
"inline void " << className << 
"::Clear() " << std::endl;
 
  688   fout << 
"{" << std::endl;
 
  689   fout << 
"   // clear coefficients" << std::endl;
 
  690   fout << 
"   fFisherCoefficients.clear(); " << std::endl;
 
  691   fout << 
"}" << std::endl;
 
  692   fout << std::setprecision(
dp);
 
 
  706   Log() << 
"Fisher discriminants select events by distinguishing the mean " << 
Endl;
 
  707   Log() << 
"values of the signal and background distributions in a trans- " << 
Endl;
 
  708   Log() << 
"formed variable space where linear correlations are removed." << 
Endl;
 
  710   Log() << 
"   (More precisely: the \"linear discriminator\" determines" << 
Endl;
 
  711   Log() << 
"    an axis in the (correlated) hyperspace of the input " << 
Endl;
 
  712   Log() << 
"    variables such that, when projecting the output classes " << 
Endl;
 
  713   Log() << 
"    (signal and background) upon this axis, they are pushed " << 
Endl;
 
  714   Log() << 
"    as far as possible away from each other, while events" << 
Endl;
 
  715   Log() << 
"    of a same class are confined in a close vicinity. The  " << 
Endl;
 
  716   Log() << 
"    linearity property of this classifier is reflected in the " << 
Endl;
 
  717   Log() << 
"    metric with which \"far apart\" and \"close vicinity\" are " << 
Endl;
 
  718   Log() << 
"    determined: the covariance matrix of the discriminating" << 
Endl;
 
  719   Log() << 
"    variable space.)" << 
Endl;
 
  723   Log() << 
"Optimal performance for Fisher discriminants is obtained for " << 
Endl;
 
  724   Log() << 
"linearly correlated Gaussian-distributed variables. Any deviation" << 
Endl;
 
  725   Log() << 
"from this ideal reduces the achievable separation power. In " << 
Endl;
 
  726   Log() << 
"particular, no discrimination at all is achieved for a variable" << 
Endl;
 
  727   Log() << 
"that has the same sample mean for signal and background, even if " << 
Endl;
 
  728   Log() << 
"the shapes of the distributions are very different. Thus, Fisher " << 
Endl;
 
  729   Log() << 
"discriminants often benefit from suitable transformations of the " << 
Endl;
 
  730   Log() << 
"input variables. For example, if a variable x in [-1,1] has a " << 
Endl;
 
  731   Log() << 
"a parabolic signal distributions, and a uniform background" << 
Endl;
 
  732   Log() << 
"distributions, their mean value is zero in both cases, leading " << 
Endl;
 
  733   Log() << 
"to no separation. The simple transformation x -> |x| renders this " << 
Endl;
 
  734   Log() << 
"variable powerful for the use in a Fisher discriminant." << 
Endl;
 
  738   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 result
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
Class that contains all the data information.
Virtual base Class for all MVA method.
Fisher and Mahalanobis Discriminants (Linear Discriminant Analysis)
void GetCov_Full(void)
compute full covariance matrix from sum of within and between matrices
void GetHelpMessage() const override
get help message text
MethodFisher(const TString &jobName, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="Fisher")
standard constructor for the "Fisher"
virtual ~MethodFisher(void)
destructor
Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets) override
Fisher can only handle classification with 2 classes.
void AddWeightsXMLTo(void *parent) const override
create XML description of Fisher classifier
void GetDiscrimPower(void)
computation of discrimination power indicator for each variable small values of "fWith" indicates lit...
void PrintCoefficients(void)
display Fisher coefficients and discriminating power for each variable check maximum length of variab...
void GetCov_BetweenClass(void)
the matrix of covariance 'between class' reflects the dispersion of the events of a class relative to...
void Init(void) override
default initialization called by all constructors
void DeclareOptions() override
MethodFisher options: format and syntax of option string: "type" where type is "Fisher" or "Mahalanob...
void MakeClassSpecific(std::ostream &, const TString &) const override
write Fisher-specific classifier response
void ReadWeightsFromXML(void *wghtnode) override
read Fisher coefficients from xml weight file
void GetFisherCoeff(void)
Fisher = Sum { [coeff]*[variables] }.
void GetMean(void)
compute mean values of variables in each sample, and the overall means
void Train(void) override
computation of Fisher coefficients by series of matrix operations
void InitMatrices(void)
initialization method; creates global matrices and vectors
void GetCov_WithinClass(void)
the matrix of covariance 'within class' reflects the dispersion of the events relative to the center ...
Double_t GetMvaValue(Double_t *err=nullptr, Double_t *errUpper=nullptr) override
returns the Fisher value (no fixed range)
void ProcessOptions() override
process user options
const Ranking * CreateRanking() override
computes ranking of input variables
void ReadWeightsFromStream(std::istream &i) override
read Fisher coefficients from weight file
Ranking for variables in method (implementation)
Singleton class for Global types used by TMVA.
create variable transformations
MsgLogger & Endl(MsgLogger &ml)
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
static uint64_t sum(uint64_t i)