00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "TMVA/SVKernelFunction.h"
00029 #include "TMVA/SVEvent.h"
00030 #include "TMath.h"
00031 #include <vector>
00032
00033
00034 TMVA::SVKernelFunction::SVKernelFunction()
00035 : fGamma(0.),
00036 fKernel(kRBF),
00037 fOrder(0),
00038 fTheta(0),
00039 fKappa(0)
00040 {
00041
00042 }
00043
00044
00045 TMVA::SVKernelFunction::SVKernelFunction( Float_t gamma )
00046 : fGamma(gamma),
00047 fKernel(kRBF),
00048 fOrder(0),
00049 fTheta(0),
00050 fKappa(0)
00051 {
00052
00053 }
00054
00055
00056 TMVA::SVKernelFunction::~SVKernelFunction()
00057 {
00058
00059 }
00060
00061
00062 void TMVA::SVKernelFunction::setCompatibilityParams(EKernelType k, UInt_t order, Float_t theta, Float_t kappa) {
00063
00064 fKernel = k;
00065 fOrder = order;
00066 fTheta = theta;
00067 fKappa = kappa;
00068 }
00069
00070
00071 Float_t TMVA::SVKernelFunction::Evaluate( SVEvent* ev1, SVEvent* ev2 )
00072 {
00073
00074 switch(fKernel) {
00075 case kRBF:
00076 {
00077 std::vector<Float_t> *v1 = ev1->GetDataVector();
00078 std::vector<Float_t> *v2 = ev2->GetDataVector();
00079
00080 Float_t norm = 0;
00081 for (UInt_t i = 0; i < v1->size(); i++) norm += ((*v1)[i] -(*v2)[i]) *((*v1)[i] -(*v2)[i]) ;
00082
00083 return TMath::Exp(-norm*fGamma);
00084 }
00085 case kPolynomial:
00086 {
00087 std::vector<Float_t> *v1 = ev1->GetDataVector();
00088 std::vector<Float_t> *v2 = ev2->GetDataVector();
00089 Float_t prod = fTheta;
00090 for (UInt_t idx = 0; idx < v1->size(); idx++) prod += (*v1)[idx] * (*v2)[idx];
00091
00092 Float_t result = 1.;
00093 Int_t i = fOrder;
00094 for (; i > 0; i /= 2) {
00095 if (i%2) result = prod;
00096 prod *= prod;
00097 }
00098 return result;
00099 }
00100 case kLinear:
00101 {
00102 std::vector<Float_t> *v1 = ev1->GetDataVector();
00103 std::vector<Float_t> *v2 = ev2->GetDataVector();
00104 Float_t prod = 0;
00105 for (UInt_t i = 0; i < v1->size(); i++) prod += (*v1)[i] * (*v2)[i];
00106 return prod;
00107 }
00108 case kSigmoidal:
00109 {
00110 std::vector<Float_t> *v1 = ev1->GetDataVector();
00111 std::vector<Float_t> *v2 = ev2->GetDataVector();
00112 Float_t prod = 0;
00113 for (UInt_t i = 0; i < v1->size(); i++) prod += ((*v1)[i] -(*v2)[i]) *((*v1)[i] -(*v2)[i]) ;
00114 prod *= fKappa;
00115 prod += fTheta;
00116 return TMath::TanH( prod );
00117 }
00118 }
00119 return 0;
00120 }
00121