21 #define GRT_DLL_EXPORTS
22 #include "ParticleClassifier.h"
31 this->numParticles = numParticles;
32 this->sensorNoise = sensorNoise;
33 this->transitionSigma = transitionSigma;
34 this->phaseSigma = phaseSigma;
35 this->velocitySigma = velocitySigma;
36 useNullRejection =
true;
37 supportsNullRejection =
true;
38 classType =
"ParticleClassifier";
39 classifierType = classType;
40 classifierMode = TIMESERIES_CLASSIFIER_MODE;
41 debugLog.setProceedingText(
"[DEBUG ParticleClassifier]");
42 errorLog.setProceedingText(
"[ERROR ParticleClassifier]");
43 trainingLog.setProceedingText(
"[TRAINING ParticleClassifier]");
44 warningLog.setProceedingText(
"[WARNING ParticleClassifier]");
59 this->numParticles = rhs.numParticles;
60 this->sensorNoise = rhs.sensorNoise;
61 this->transitionSigma = rhs.transitionSigma;
62 this->phaseSigma = rhs.phaseSigma;
63 this->velocitySigma = rhs.velocitySigma;
64 this->particleFilter = rhs.particleFilter;
73 if( classifier == NULL )
return false;
78 this->numParticles = ptr->numParticles;
79 this->sensorNoise = ptr->sensorNoise;
80 this->transitionSigma = ptr->transitionSigma;
81 this->phaseSigma = ptr->phaseSigma;
82 this->velocitySigma = ptr->velocitySigma;
83 this->particleFilter = ptr->particleFilter;
101 trainingData.
scale(0, 1);
105 particleFilter.train( numParticles, trainingData, sensorNoise, transitionSigma, phaseSigma, velocitySigma );
107 classLabels.
resize(numClasses);
108 classLikelihoods.
resize(numClasses,0);
109 classDistances.
resize(numClasses,0);
111 for(
unsigned int i=0; i<numClasses; i++){
123 errorLog <<
"predict_(VectorDouble &inputVector) - The model has not been trained!" << std::endl;
127 if( numInputDimensions != inputVector.size() ){
128 errorLog <<
"predict_(VectorDouble &inputVector) - The number of features in the model " << numInputDimensions <<
" does not match that of the input vector " << inputVector.size() << std::endl;
134 for(
unsigned int j=0; j<numInputDimensions; j++){
135 inputVector[j] =
scale(inputVector[j],ranges[j].minValue,ranges[j].maxValue,0,1);
139 predictedClassLabel = 0;
141 std::fill(classLikelihoods.begin(),classLikelihoods.end(),0);
142 std::fill(classDistances.begin(),classDistances.end(),0);
145 particleFilter.
filter( inputVector );
148 unsigned int gestureTemplate = 0;
149 unsigned int gestureLabel = 0;
150 unsigned int gestureIndex = 0;
151 for(
unsigned int i=0; i<numParticles; i++){
152 gestureTemplate = (
unsigned int)particleFilter[i].x[0];
153 gestureLabel = particleFilter.gestureTemplates[ gestureTemplate ].classLabel;
156 classDistances[ gestureIndex ] += particleFilter[i].w;
159 bool rejectPrediction =
false;
160 if( useNullRejection ){
162 rejectPrediction =
true;
167 for(
unsigned int i=0; i<numClasses; i++){
169 classLikelihoods[ i ] = rejectPrediction ? 0 : classDistances[i];
171 if( classLikelihoods[i] > maxLikelihood ){
172 predictedClassLabel = classLabels[i];
173 maxLikelihood = classLikelihoods[i];
188 particleFilter.
clear();
197 particleFilter.reset();
206 errorLog <<
"save(fstream &file) - The file is not open!" << std::endl;
219 errorLog <<
"load(string filename) - Could not open file to load model" << std::endl;
228 bestDistance = DEFAULT_NULL_DISTANCE_VALUE;
230 classDistances.
resize(numClasses,DEFAULT_NULL_DISTANCE_VALUE);
236 return particleFilter.gestureTemplates;
240 return particleFilter;
243 VectorDouble ParticleClassifier::getStateEstimation()
const{
247 Float ParticleClassifier::getPhase()
const{
254 Float ParticleClassifier::getVelocity()
const{
261 bool ParticleClassifier::setNumParticles(
const unsigned int numParticles){
265 this->numParticles = numParticles;
270 bool ParticleClassifier::setSensorNoise(
const unsigned int sensorNoise){
274 this->sensorNoise = sensorNoise;
279 bool ParticleClassifier::setTransitionSigma(
const unsigned int transitionSigma){
283 this->transitionSigma = transitionSigma;
288 bool ParticleClassifier::setPhaseSigma(
const unsigned int phaseSigma){
292 this->phaseSigma = phaseSigma;
297 bool ParticleClassifier::setVelocitySigma(
const unsigned int velocitySigma){
301 this->velocitySigma = velocitySigma;
Float getWeightSum() const
#define DEFAULT_NULL_LIKELIHOOD_VALUE
virtual bool filter(SENSOR_DATA &data)
Float scale(const Float &x, const Float &minSource, const Float &maxSource, const Float &minTarget, const Float &maxTarget, const bool constrain=false)
virtual ~ParticleClassifier(void)
std::string getClassifierType() const
virtual bool resize(const unsigned int size)
UINT getClassLabelIndexValue(UINT classLabel) const
virtual bool load(std::fstream &file)
ParticleClassifier & operator=(const ParticleClassifier &rhs)
Vector< MinMax > getRanges() const
Vector< ClassTracker > getClassTracker() const
virtual bool save(std::fstream &file) const
virtual bool predict_(VectorFloat &inputVector)
virtual bool train_(TimeSeriesClassificationData &trainingData)
bool copyBaseVariables(const Classifier *classifier)
ParticleClassifier(const unsigned int numParticles=2000, const Float sensorNoise=20.0, const Float transitionSigma=0.005, const Float phaseSigma=0.1, const Float velocitySigma=0.01)
bool scale(const Float minTarget, const Float maxTarget)
UINT getNumDimensions() const
UINT getNumClasses() const
virtual bool deepCopyFrom(const Classifier *classifier)
VectorFloat getStateEstimation() const