21 #ifndef GRT_PARTICLE_CLASSIFIER_PARTICLE_FILTER_HEADER 22 #define GRT_PARTICLE_CLASSIFIER_PARTICLE_FILTER_HEADER 24 #include "../../CoreAlgorithms/ParticleFilter/ParticleFilter.h" 38 unsigned int getLength()
const {
42 unsigned int classLabel;
50 setEstimationMode( WEIGHTED_MEAN );
61 unsigned int numRandomFlipParticles = 0;
63 for(
unsigned int i=0; i<numRandomFlipParticles; i++){
65 unsigned int randomParticleIndex = i;
67 particles[ randomParticleIndex ].x[0] = rand.getRandomNumberInt(0, numTemplates);
68 particles[ randomParticleIndex ].x[1] = rand.getRandomNumberUniform(0,1);
69 particles[ randomParticleIndex ].x[2] = 0;
83 const Float phase = p.x[1];
86 p.x[1] =
Util::limit( phase + rand.getRandomNumberGauss(0.0,processNoise[1]) , 0, 1);
89 p.x[2] += phase-p.x[1];
92 p.x[2] =
Util::limit( p.x[2], -processNoise[2], processNoise[2] );
103 const unsigned int templateIndex = (
unsigned int)p.x[0];
105 if( templateIndex >= numTemplates ){
106 errorLog <<
"update( Particle &p, VectorFloat &data ) - Template index out of bounds! templateIndex: " << templateIndex << std::endl;
111 const unsigned int templateLength = gestureTemplates[templateIndex].timeseries.getNumRows();
112 const unsigned int templatePos = (
unsigned int)(p.x[1] * Float(templateLength-1));
114 if( templatePos >= templateLength ){
115 errorLog <<
"update( Particle &p, VectorFloat &data ) - Template position out of bounds! templatePos: " << templatePos <<
" templateLength: " << templateLength << std::endl;
119 for(
unsigned int j=0; j<numInputDimensions; j++){
120 p.w *= gauss( data[j], gestureTemplates[templateIndex].timeseries[templatePos][j], measurementNoise[j] );
131 numInputDimensions = 0;
135 gestureTemplates.clear();
140 bool train(
const unsigned int numParticles,
const TimeSeriesClassificationData &trainingData, Float sensorNoise, Float transitionSigma, Float phaseSigma, Float velocitySigma){
145 this->numParticles = numParticles;
150 gestureTemplates.resize( numTemplates );
151 for(
unsigned int i=0; i<numTemplates; i++){
152 gestureTemplates[i].classLabel = trainingData[i].getClassLabel();
153 gestureTemplates[i].timeseries = trainingData[i].getData();
162 initModel.resize( stateVectorSize,
VectorFloat(2,0) );
163 processNoise.resize( stateVectorSize );
164 measurementNoise.resize( numInputDimensions );
169 initModel[2][0] = -0.2;
172 initModel[0][1] = numTemplates;
174 initModel[2][1] = 0.2;
177 for(
unsigned int i=0; i<numInputDimensions; i++){
178 measurementNoise[i] = sensorNoise;
182 processNoise[0] = transitionSigma;
183 processNoise[1] = phaseSigma;
184 processNoise[2] = velocitySigma;
186 x.resize( stateVectorSize );
189 if( !initParticles( numParticles ) ){
190 errorLog <<
"ERROR: Failed to init particles!" << std::endl;
208 unsigned int numInputDimensions;
209 unsigned int numTemplates;
210 unsigned int numClasses;
211 unsigned int resampleCounter;
218 #endif //GRT_PARTICLE_CLASSIFIER_PARTICLE_FILTER_HEADER
virtual bool predict(Particle &p)
virtual bool preFilterUpdate(VectorFloat &data)
virtual bool update(Particle &p, VectorFloat &data)
unsigned int getNumRows() const
UINT getNumDimensions() const
static Float limit(const Float value, const Float minValue, const Float maxValue)
UINT getNumClasses() const
UINT getNumSamples() const
virtual bool postFilterUpdate(VectorFloat &data)