106 (*fLDCoeff)[iout] =
new std::vector<Double_t>(
GetNvar()+1 );
122 for (vector< vector< Double_t >* >::iterator vi=
fLDCoeff->begin(); vi!=
fLDCoeff->end(); ++vi){
123 if (*vi) {
delete *vi; *vi = 0; }
136 Log() <<
"regression with " << numberTargets <<
" targets.";
173 (*fRegressionReturnVal)[iout] = (*(*fLDCoeff)[iout])[0] ;
176 for (
auto const& val : ev->
GetValues()) {
177 (*fRegressionReturnVal)[iout] += (*(*fLDCoeff)[iout])[++icoeff] * val;
198 (*fRegressionReturnVal)[iout] = (*(*fLDCoeff)[iout])[0] ;
201 for (
auto const& val : ev->
GetValues()) {
202 (*fRegressionReturnVal)[iout] += (*(*fLDCoeff)[iout])[++icoeff] * val;
237 for (
UInt_t ivar = 0; ivar<=nvar; ivar++){
238 for (
UInt_t jvar = 0; jvar<=nvar; jvar++) (*
fSumMatx)( ivar, jvar ) = 0;
243 for (
Int_t ievt=0; ievt<nevts; ievt++) {
250 (*fSumMatx)( 0, 0 ) += weight;
253 for (
UInt_t ivar=0; ivar<nvar; ivar++) {
254 (*fSumMatx)( ivar+1, 0 ) += ev->
GetValue( ivar ) * weight;
255 (*fSumMatx)( 0, ivar+1 ) += ev->
GetValue( ivar ) * weight;
259 for (
UInt_t ivar=0; ivar<nvar; ivar++){
260 for (
UInt_t jvar=0; jvar<nvar; jvar++){
261 (*fSumMatx)( ivar+1, jvar+1 ) += ev->
GetValue( ivar ) * ev->
GetValue( jvar ) * weight;
275 for (
UInt_t jvar = 0; jvar<=nvar; jvar++){
276 (*fSumValMatx)(jvar,ivar) = 0;
281 for (
Int_t ievt=0; ievt<
Data()->GetNEvents(); ievt++) {
299 (*fSumValMatx)( 0,ivar ) += val;
300 for (
UInt_t jvar=0; jvar<nvar; jvar++) {
301 (*fSumValMatx)(jvar+1,ivar ) += ev->
GetValue(jvar) * val;
317 Log() << kWARNING <<
"<GetCoeff> matrix is almost singular with determinant="
319 <<
" did you use the variables that are linear combinations or highly correlated?"
323 Log() << kFATAL <<
"<GetCoeff> matrix is singular with determinant="
325 <<
" did you use the variables that are linear combinations?"
331 for (
UInt_t jvar = 0; jvar<nvar+1; jvar++) {
332 (*(*fLDCoeff)[ivar])[jvar] = (*
fCoeffMatx)(jvar, ivar );
335 (*(*fLDCoeff)[ivar])[0]=0.0;
336 for (
UInt_t jvar = 1; jvar<nvar+1; jvar++){
339 (*(*fLDCoeff)[ivar])[0]/=-2.0;
352 istr >> (*(*fLDCoeff)[iout])[icoeff];
386 if (ncoeff !=
GetNvar()+1)
Log() << kFATAL <<
"Mismatch in number of output variables/coefficients: "
391 for (vector< vector< Double_t >* >::iterator vi=
fLDCoeff->begin(); vi!=
fLDCoeff->end(); ++vi){
392 if (*vi) {
delete *vi; *vi = 0; }
397 for (
Int_t ivar = 0; ivar<fNRegOut; ivar++) (*fLDCoeff)[ivar] = new std::vector<Double_t>( ncoeff );
407 (*(*fLDCoeff)[iout])[icoeff] = coeff;
418 fout <<
" std::vector<double> fLDCoefficients;" << std::endl;
419 fout <<
"};" << std::endl;
420 fout <<
"" << std::endl;
421 fout <<
"inline void " << className <<
"::Initialize() " << std::endl;
422 fout <<
"{" << std::endl;
424 Int_t dp = fout.precision();
425 fout <<
" fLDCoefficients.push_back( "
426 << std::setprecision(12) << (*(*fLDCoeff)[0])[ivar]
427 << std::setprecision(dp) <<
" );" << std::endl;
430 fout <<
" // sanity check" << std::endl;
431 fout <<
" if (fLDCoefficients.size() != fNvars+1) {" << std::endl;
432 fout <<
" std::cout << \"Problem in class \\\"\" << fClassName << \"\\\"::Initialize: mismatch in number of input values\"" << std::endl;
433 fout <<
" << fLDCoefficients.size() << \" != \" << fNvars+1 << std::endl;" << std::endl;
434 fout <<
" fStatusIsClean = false;" << std::endl;
435 fout <<
" } " << std::endl;
436 fout <<
"}" << std::endl;
438 fout <<
"inline double " << className <<
"::GetMvaValue__( const std::vector<double>& inputValues ) const" << std::endl;
439 fout <<
"{" << std::endl;
440 fout <<
" double retval = fLDCoefficients[0];" << std::endl;
441 fout <<
" for (size_t ivar = 1; ivar < fNvars+1; ivar++) {" << std::endl;
442 fout <<
" retval += fLDCoefficients[ivar]*inputValues[ivar-1];" << std::endl;
443 fout <<
" }" << std::endl;
445 fout <<
" return retval;" << std::endl;
446 fout <<
"}" << std::endl;
448 fout <<
"// Clean up" << std::endl;
449 fout <<
"inline void " << className <<
"::Clear() " << std::endl;
450 fout <<
"{" << std::endl;
451 fout <<
" // clear coefficients" << std::endl;
452 fout <<
" fLDCoefficients.clear(); " << std::endl;
453 fout <<
"}" << std::endl;
491 Log() << kHEADER <<
"Results for LD coefficients:" <<
Endl;
494 Log() << kINFO <<
"NOTE: The coefficients must be applied to TRANFORMED variables" <<
Endl;
495 Log() << kINFO <<
" List of the transformation: " <<
Endl;
498 Log() << kINFO <<
" -- " << trf->GetName() <<
Endl;
501 std::vector<TString> vars;
502 std::vector<Double_t> coeffs;
505 coeffs.push_back( (* (*
fLDCoeff)[0])[ivar+1] );
507 vars .push_back(
"(offset)" );
508 coeffs.push_back((* (*
fLDCoeff)[0])[0] );
511 Log() << kINFO <<
"NOTE: You have chosen to use the \"Normalise\" booking option. Hence, the" <<
Endl;
512 Log() << kINFO <<
" coefficients must be applied to NORMALISED (') variables as follows:" <<
Endl;
521 << std::setw(3) << (
GetXmin(ivar) > 0 ?
" - " :
" + ")
524 << std::setw(3) <<
" - 1"
527 Log() << kINFO <<
"The TMVA Reader will properly account for this normalisation, but if the" <<
Endl;
528 Log() << kINFO <<
"LD classifier is applied outside the Reader, the transformation must be" <<
Endl;
529 Log() << kINFO <<
"implemented -- or the \"Normalise\" option is removed and LD retrained." <<
Endl;
545 Log() <<
"Linear discriminants select events by distinguishing the mean " <<
Endl;
546 Log() <<
"values of the signal and background distributions in a trans- " <<
Endl;
547 Log() <<
"formed variable space where linear correlations are removed." <<
Endl;
548 Log() <<
"The LD implementation here is equivalent to the \"Fisher\" discriminant" <<
Endl;
549 Log() <<
"for classification, but also provides linear regression." <<
Endl;
551 Log() <<
" (More precisely: the \"linear discriminator\" determines" <<
Endl;
552 Log() <<
" an axis in the (correlated) hyperspace of the input " <<
Endl;
553 Log() <<
" variables such that, when projecting the output classes " <<
Endl;
554 Log() <<
" (signal and background) upon this axis, they are pushed " <<
Endl;
555 Log() <<
" as far as possible away from each other, while events" <<
Endl;
556 Log() <<
" of a same class are confined in a close vicinity. The " <<
Endl;
557 Log() <<
" linearity property of this classifier is reflected in the " <<
Endl;
558 Log() <<
" metric with which \"far apart\" and \"close vicinity\" are " <<
Endl;
559 Log() <<
" determined: the covariance matrix of the discriminating" <<
Endl;
560 Log() <<
" variable space.)" <<
Endl;
564 Log() <<
"Optimal performance for the linear discriminant is obtained for " <<
Endl;
565 Log() <<
"linearly correlated Gaussian-distributed variables. Any deviation" <<
Endl;
566 Log() <<
"from this ideal reduces the achievable separation power. In " <<
Endl;
567 Log() <<
"particular, no discrimination at all is achieved for a variable" <<
Endl;
568 Log() <<
"that has the same sample mean for signal and background, even if " <<
Endl;
569 Log() <<
"the shapes of the distributions are very different. Thus, the linear " <<
Endl;
570 Log() <<
"discriminant often benefits from a suitable transformation of the " <<
Endl;
571 Log() <<
"input variables. For example, if a variable x in [-1,1] has a " <<
Endl;
572 Log() <<
"a parabolic signal distributions, and a uniform background" <<
Endl;
573 Log() <<
"distributions, their mean value is zero in both cases, leading " <<
Endl;
574 Log() <<
"to no separation. The simple transformation x -> |x| renders this " <<
Endl;
575 Log() <<
"variable powerful for the use in a linear discriminant." <<
Endl;
#define REGISTER_METHOD(CLASS)
for example
int Int_t
Signed integer 4 bytes (int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
long long Long64_t
Portable signed long integer 8 bytes.
TMatrixT< Double_t > TMatrixD
void AddPreDefVal(const T &)
Class that contains all the data information.
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
void SetTarget(UInt_t itgt, Float_t value)
set the target value (dimension itgt) to value
Double_t GetWeight() const
return the event weight - depending on whether the flag IgnoreNegWeightsInTraining is or not.
std::vector< Float_t > & GetValues()
Float_t GetTarget(UInt_t itgt) const
MethodBase(const TString &jobName, Types::EMVA methodType, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="")
standard constructor
Bool_t HasTrainingTree() const
const char * GetName() const override
Double_t GetXmin(Int_t ivar) const
Bool_t IgnoreEventsWithNegWeightsInTraining() const
UInt_t GetNTargets() const
Bool_t DoRegression() const
std::vector< Float_t > * fRegressionReturnVal
const Event * GetEvent() const
DataSetInfo & DataInfo() const
Double_t GetXmax(Int_t ivar) const
TransformationHandler & GetTransformationHandler(Bool_t takeReroutedIfAvailable=true)
void SetSignalReferenceCut(Double_t cut)
void NoErrorCalc(Double_t *const err, Double_t *const errUpper)
const TString & GetInputLabel(Int_t i) const
Bool_t IsNormalised() const
void GetSum(void)
Calculates the matrix transposed(X)*W*X with W being the diagonal weight matrix and X the coordinates...
void ReadWeightsFromStream(std::istream &i) override
read LD coefficients from weight file
Int_t fNRegOut
size of the output
void Init(void) override
default initialization called by all constructors
TMatrixD * fCoeffMatx
Matrix of coefficients.
MethodLD(const TString &jobName, const TString &methodTitle, DataSetInfo &dsi, const TString &theOption="LD")
standard constructor for the LD
std::vector< std::vector< Double_t > * > * fLDCoeff
LD coefficients.
Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets) override
LD can handle classification with 2 classes and regression with one regression-target.
void MakeClassSpecific(std::ostream &, const TString &) const override
write LD-specific classifier response
void ReadWeightsFromXML(void *wghtnode) override
read coefficients from xml weight file
void GetLDCoeff(void)
Calculates the coefficients used for classification/regression.
void GetHelpMessage() const override
get help message text
const Ranking * CreateRanking() override
computes ranking of input variables
void DeclareOptions() override
MethodLD options.
TMatrixD * fSumValMatx
Sum of values multiplied by coordinates.
const std::vector< Float_t > & GetRegressionValues() override
Calculates the regression output.
Double_t GetMvaValue(Double_t *err=nullptr, Double_t *errUpper=nullptr) override
Returns the MVA classification output.
TMatrixD * fSumMatx
Sum of coordinates product matrix.
void PrintCoefficients(void)
Display the classification/regression coefficients for each variable.
void AddWeightsXMLTo(void *parent) const override
create XML description for LD classification and regression (for arbitrary number of output classes/t...
virtual ~MethodLD(void)
destructor
void Train(void) override
compute fSumMatx
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.
void ProcessOptions() override
this is the preparation for training
Ranking for variables in method (implementation).
Singleton class for Global types used by TMVA.
Double_t Determinant() const override
Return the matrix determinant.
TMatrixT< Element > & Invert(Double_t *det=nullptr)
Invert the matrix and calculate its determinant.
create variable transformations
MsgLogger & Endl(MsgLogger &ml)
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.