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)