Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArSupportVectorMachine.h
Go to the documentation of this file.
1
8#ifndef LAR_SUPPORT_VECTOR_MACHINE_H
9#define LAR_SUPPORT_VECTOR_MACHINE_H 1
10
12
14
15#include "Helpers/XmlHelper.h"
16#include "Pandora/StatusCodes.h"
17
18#include <functional>
19#include <map>
20#include <vector>
21
22//------------------------------------------------------------------------------------------------------------------------------------------
23
24namespace lar_content
25{
26
31{
32public:
33 typedef std::function<double(const LArMvaHelper::MvaFeatureVector &, const LArMvaHelper::MvaFeatureVector &, const double)> KernelFunction;
34
46
51
60 pandora::StatusCode Initialize(const std::string &parameterLocation, const std::string &svmName);
61
69 bool Classify(const LArMvaHelper::MvaFeatureVector &features) const;
70
79
87 double CalculateProbability(const LArMvaHelper::MvaFeatureVector &features) const;
88
94 bool IsInitialized() const;
95
101 unsigned int GetNFeatures() const;
102
108 void SetKernelFunction(KernelFunction kernelFunction);
109
110private:
115 {
116 public:
123 SupportVectorInfo(const double yAlpha, LArMvaHelper::MvaFeatureVector supportVector);
124
125 double m_yAlpha;
127 };
128
133 {
134 public:
141 FeatureInfo(const double muValue, const double sigmaValue);
142
146 FeatureInfo();
147
155 double StandardizeParameter(const double parameter) const;
156
157 double m_muValue;
159 };
160
161 typedef std::vector<SupportVectorInfo> SVInfoList;
162 typedef std::vector<FeatureInfo> FeatureInfoVector;
163
164 typedef std::map<KernelType, KernelFunction> KernelMap;
165
167
171
173 unsigned int m_nFeatures;
174 double m_bias;
176
179
183
190 void ReadXmlFile(const std::string &svmFileName, const std::string &svmName);
191
200
209
218
227
236
246 static double QuadraticKernel(
247 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor = 1.);
248
258 static double CubicKernel(
259 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor = 1.);
260
270 static double LinearKernel(
271 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor = 1.);
272
282 static double GaussianRbfKernel(
283 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor = 1.);
284};
285
286//------------------------------------------------------------------------------------------------------------------------------------------
287
289{
290 return (this->CalculateClassificationScoreImpl(features) > 0.);
291}
292
293//------------------------------------------------------------------------------------------------------------------------------------------
294
296{
297 return this->CalculateClassificationScoreImpl(features);
298}
299
300//------------------------------------------------------------------------------------------------------------------------------------------
301
303{
305 {
306 std::cout << "LArSupportVectorMachine: cannot calculate probabilities for this SVM" << std::endl;
307 throw pandora::STATUS_CODE_NOT_INITIALIZED;
308 }
309
310 // Use the logistic function to map the linearly-transformed score on the interval (-inf,inf) to a probability on [0,1] - the two free
311 // parameters in the linear transformation are trained such that the logistic map produces an accurate probability
312 const double scaledScore = m_probAParameter * this->CalculateClassificationScoreImpl(features) + m_probBParameter;
313
314 return 1. / (1. + std::exp(scaledScore));
315}
316
317//------------------------------------------------------------------------------------------------------------------------------------------
318
320{
321 return m_isInitialized;
322}
323
324//------------------------------------------------------------------------------------------------------------------------------------------
325
326inline unsigned int SupportVectorMachine::GetNFeatures() const
327{
328 return m_nFeatures;
329}
330
331//------------------------------------------------------------------------------------------------------------------------------------------
332
334{
335 m_kernelFunction = std::move(kernelFunction);
336}
337
338//------------------------------------------------------------------------------------------------------------------------------------------
339
341 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor)
342{
343 const double denominator(scaleFactor * scaleFactor);
344 if (denominator < std::numeric_limits<double>::epsilon())
345 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
346
347 double total(0.);
348 for (unsigned int i = 0; i < features.size(); ++i)
349 total += supportVector.at(i).Get() * features.at(i).Get();
350
351 return total / denominator;
352}
353
354//------------------------------------------------------------------------------------------------------------------------------------------
355
357 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor)
358{
359 const double denominator(scaleFactor * scaleFactor);
360 if (denominator < std::numeric_limits<double>::epsilon())
361 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
362
363 double total(0.);
364 for (unsigned int i = 0; i < features.size(); ++i)
365 total += supportVector.at(i).Get() * features.at(i).Get();
366
367 total = total / denominator + 1.;
368 return total * total;
369}
370
371//------------------------------------------------------------------------------------------------------------------------------------------
372
374 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor)
375{
376 const double denominator(scaleFactor * scaleFactor);
377 if (denominator < std::numeric_limits<double>::epsilon())
378 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
379
380 double total(0.);
381 for (unsigned int i = 0; i < features.size(); ++i)
382 total += supportVector.at(i).Get() * features.at(i).Get();
383
384 total = total / denominator + 1.;
385 return total * total * total;
386}
387
388//------------------------------------------------------------------------------------------------------------------------------------------
389
391 const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor)
392{
393 double total(0.);
394 for (unsigned int i = 0; i < features.size(); ++i)
395 total += (supportVector.at(i).Get() - features.at(i).Get()) * (supportVector.at(i).Get() - features.at(i).Get());
396
397 return std::exp(-scaleFactor * total);
398}
399
400//------------------------------------------------------------------------------------------------------------------------------------------
401
403 m_yAlpha(yAlpha),
404 m_supportVector(std::move(supportVector))
405{
406}
407
408//------------------------------------------------------------------------------------------------------------------------------------------
409
410inline SupportVectorMachine::FeatureInfo::FeatureInfo(const double muValue, const double sigmaValue) :
411 m_muValue(muValue),
412 m_sigmaValue(sigmaValue)
413{
414}
415
416//------------------------------------------------------------------------------------------------------------------------------------------
417
418inline SupportVectorMachine::FeatureInfo::FeatureInfo() : m_muValue(0.), m_sigmaValue(0.)
419{
420}
421
422//------------------------------------------------------------------------------------------------------------------------------------------
423
424inline double SupportVectorMachine::FeatureInfo::StandardizeParameter(const double parameter) const
425{
426 if (m_sigmaValue < std::numeric_limits<double>::epsilon())
427 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
428
429 return (parameter - m_muValue) / m_sigmaValue;
430}
431
432} // namespace lar_content
433
434#endif // #ifndef LAR_SUPPORT_VECTOR_MACHINE_H
Header file for the lar multivariate analysis interface class.
Header file defining status codes and relevant preprocessor macros.
Header file for the xml helper class.
MvaTypes::MvaFeatureVector MvaFeatureVector
MvaInterface class.
double m_muValue
The average value of this feature.
double StandardizeParameter(const double parameter) const
Standardize a parameter corresponding to this feature.
FeatureInfo()
Default constructor to allow default-construction of (uninitialized) svms.
LArMvaHelper::MvaFeatureVector m_supportVector
The support vector.
double m_yAlpha
The alpha-value multiplied by the y-value for the support vector.
SupportVectorInfo(const double yAlpha, LArMvaHelper::MvaFeatureVector supportVector)
Constructor.
double CalculateClassificationScore(const LArMvaHelper::MvaFeatureVector &features) const
Calculate the classification score for a set of input features, based on the trained model.
pandora::StatusCode ReadMachine(const pandora::TiXmlHandle &currentHandle)
Read the machine component at the current xml handle.
bool m_standardizeFeatures
Whether to standardize the features.
static double GaussianRbfKernel(const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor=1.)
A gaussian RBF kernel.
static double CubicKernel(const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor=1.)
An inhomogeneous cubic kernel.
pandora::StatusCode ReadSupportVector(const pandora::TiXmlHandle &currentHandle)
Read the support vector component at the current xml handle.
pandora::StatusCode ReadFeatures(const pandora::TiXmlHandle &currentHandle)
Read the feature component at the current xml handle.
FeatureInfoVector m_featureInfoList
The list of FeatureInfo objects.
SVInfoList m_svInfoList
The list of SupportVectorInfo objects.
std::function< double(const LArMvaHelper::MvaFeatureVector &, const LArMvaHelper::MvaFeatureVector &, const double)> KernelFunction
void SetKernelFunction(KernelFunction kernelFunction)
Set the kernel function to use.
void ReadXmlFile(const std::string &svmFileName, const std::string &svmName)
Read the svm parameters from an xml file.
KernelMap m_kernelMap
Map from the kernel types to the kernel functions.
std::map< KernelType, KernelFunction > KernelMap
pandora::StatusCode ReadComponent(pandora::TiXmlElement *pCurrentXmlElement)
Read the component at the current xml element.
unsigned int m_nFeatures
The number of features.
double m_probAParameter
The first-order score coefficient for mapping to a probability using the logistic function.
bool m_enableProbability
Whether to enable probability calculations.
double m_scaleFactor
The kernel scale factor.
bool IsInitialized() const
Query whether this svm is initialized.
bool m_isInitialized
Whether this svm has been initialized.
double CalculateClassificationScoreImpl(const LArMvaHelper::MvaFeatureVector &features) const
Implementation method for calculating the classification score using the trained model.
static double LinearKernel(const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor=1.)
A linear kernel.
static double QuadraticKernel(const LArMvaHelper::MvaFeatureVector &supportVector, const LArMvaHelper::MvaFeatureVector &features, const double scaleFactor=1.)
An inhomogeneous quadratic kernel.
bool Classify(const LArMvaHelper::MvaFeatureVector &features) const
Make a classification for a set of input features, based on the trained model.
double m_probBParameter
The score offset parameter for mapping to a probability using the logistic function.
std::vector< SupportVectorInfo > SVInfoList
pandora::StatusCode Initialize(const std::string &parameterLocation, const std::string &svmName)
Initialize the svm using a serialized model.
KernelFunction m_kernelFunction
The kernel function.
double CalculateProbability(const LArMvaHelper::MvaFeatureVector &features) const
Calculate the classification probability for a set of input features, based on the trained model.
unsigned int GetNFeatures() const
Get the number of features.
std::vector< FeatureInfo > FeatureInfoVector
StatusCodeException class.
StatusCode
The StatusCode enum.