21 #include "ParticleClassifier.h"
26 RegisterClassifierModule< ParticleClassifier > ParticleClassifier::registerModule(
"ParticleClassifier");
30 this->numParticles = numParticles;
31 this->sensorNoise = sensorNoise;
32 this->transitionSigma = transitionSigma;
33 this->phaseSigma = phaseSigma;
34 this->velocitySigma = velocitySigma;
35 useNullRejection =
true;
36 supportsNullRejection =
true;
37 classType =
"ParticleClassifier";
38 classifierType = classType;
39 classifierMode = TIMESERIES_CLASSIFIER_MODE;
40 debugLog.setProceedingText(
"[DEBUG ParticleClassifier]");
41 errorLog.setProceedingText(
"[ERROR ParticleClassifier]");
42 trainingLog.setProceedingText(
"[TRAINING ParticleClassifier]");
43 warningLog.setProceedingText(
"[WARNING ParticleClassifier]");
58 this->numParticles = rhs.numParticles;
59 this->sensorNoise = rhs.sensorNoise;
60 this->transitionSigma = rhs.transitionSigma;
61 this->phaseSigma = rhs.phaseSigma;
62 this->velocitySigma = rhs.velocitySigma;
63 this->particleFilter = rhs.particleFilter;
72 if( classifier == NULL )
return false;
77 this->numParticles = ptr->numParticles;
78 this->sensorNoise = ptr->sensorNoise;
79 this->transitionSigma = ptr->transitionSigma;
80 this->phaseSigma = ptr->phaseSigma;
81 this->velocitySigma = ptr->velocitySigma;
82 this->particleFilter = ptr->particleFilter;
100 trainingData.
scale(0, 1);
104 particleFilter.train( numParticles, trainingData, sensorNoise, transitionSigma, phaseSigma, velocitySigma );
106 classLabels.resize(numClasses);
107 classLikelihoods.resize(numClasses,0);
108 classDistances.resize(numClasses,0);
110 for(
unsigned int i=0; i<numClasses; i++){
122 errorLog <<
"predict_(VectorDouble &inputVector) - The model has not been trained!" << endl;
126 if( numInputDimensions != inputVector.size() ){
127 errorLog <<
"predict_(VectorDouble &inputVector) - The number of features in the model " << numInputDimensions <<
" does not match that of the input vector " << inputVector.size() << endl;
133 for(
unsigned int j=0; j<numInputDimensions; j++){
134 inputVector[j] =
scale(inputVector[j],ranges[j].minValue,ranges[j].maxValue,0,1);
138 predictedClassLabel = 0;
140 std::fill(classLikelihoods.begin(),classLikelihoods.end(),0);
141 std::fill(classDistances.begin(),classDistances.end(),0);
144 particleFilter.
filter( inputVector );
147 unsigned int gestureTemplate = 0;
148 unsigned int gestureLabel = 0;
149 unsigned int gestureIndex = 0;
150 for(
unsigned int i=0; i<numParticles; i++){
151 gestureTemplate = (
unsigned int)particleFilter[i].x[0];
152 gestureLabel = particleFilter.gestureTemplates[ gestureTemplate ].classLabel;
155 classDistances[ gestureIndex ] += particleFilter[i].w;
158 bool rejectPrediction =
false;
159 if( useNullRejection ){
161 rejectPrediction =
true;
166 for(
unsigned int i=0; i<numClasses; i++){
168 classLikelihoods[ i ] = rejectPrediction ? 0 : classDistances[i];
170 if( classLikelihoods[i] > maxLikelihood ){
171 predictedClassLabel = classLabels[i];
172 maxLikelihood = classLikelihoods[i];
187 particleFilter.
clear();
196 particleFilter.reset();
205 errorLog <<
"saveModelToFile(fstream &file) - The file is not open!" << endl;
220 errorLog <<
"loadModelFromFile(string filename) - Could not open file to load model" << endl;
230 maxLikelihood = DEFAULT_NULL_LIKELIHOOD_VALUE;
231 bestDistance = DEFAULT_NULL_DISTANCE_VALUE;
232 classLikelihoods.resize(numClasses,DEFAULT_NULL_LIKELIHOOD_VALUE);
233 classDistances.resize(numClasses,DEFAULT_NULL_DISTANCE_VALUE);
238 const vector< ParticleClassifierGestureTemplate >& ParticleClassifier::getGestureTemplates()
const{
239 return particleFilter.gestureTemplates;
242 const ParticleClassifierParticleFilter& ParticleClassifier::getParticleFilter()
const {
243 return particleFilter;
246 VectorDouble ParticleClassifier::getStateEstimation()
const{
250 double ParticleClassifier::getPhase()
const{
257 double ParticleClassifier::getVelocity()
const{
264 bool ParticleClassifier::setNumParticles(
const unsigned int numParticles){
268 this->numParticles = numParticles;
273 bool ParticleClassifier::setSensorNoise(
const unsigned int sensorNoise){
277 this->sensorNoise = sensorNoise;
282 bool ParticleClassifier::setTransitionSigma(
const unsigned int transitionSigma){
286 this->transitionSigma = transitionSigma;
291 bool ParticleClassifier::setPhaseSigma(
const unsigned int phaseSigma){
295 this->phaseSigma = phaseSigma;
300 bool ParticleClassifier::setVelocitySigma(
const unsigned int velocitySigma){
304 this->velocitySigma = velocitySigma;
virtual ~ParticleClassifier(void)
VectorDouble getStateEstimation() const
bool copyBaseVariables(const Classifier *classifier)
UINT getNumDimensions() const
ParticleClassifier(const unsigned int numParticles=2000, const double sensorNoise=20.0, const double transitionSigma=0.005, const double phaseSigma=0.1, const double velocitySigma=0.01)
virtual bool saveModelToFile(fstream &file) const
virtual bool loadModelFromFile(fstream &file)
double scale(const double &x, const double &minSource, const double &maxSource, const double &minTarget, const double &maxTarget, const bool constrain=false)
UINT getClassLabelIndexValue(UINT classLabel) const
double getWeightSum() const
UINT getNumClasses() const
bool scale(const double minTarget, const double maxTarget)
vector< ClassTracker > getClassTracker() const
virtual bool train_(TimeSeriesClassificationData &trainingData)
string getClassifierType() const
virtual bool deepCopyFrom(const Classifier *classifier)
ParticleClassifier & operator=(const ParticleClassifier &rhs)
vector< MinMax > getRanges() const
virtual bool predict_(VectorDouble &inputVector)
virtual bool filter(SENSOR_DATA &data)