The Machine Perception Toolbox

[Introduction]- [News]- [Download]- [Screenshots]- [Manual (pdf)]- [Forums]- [API Reference]- [Repository ]

 

Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

cluster.h

Go to the documentation of this file.
00001 #ifndef __CLUSTER_H__
00002 #define __CLUSTER_H__
00003 
00004 #include "common.h"
00005 #include "faceboxlist.h"
00006 #include <fstream>
00007 #include <math.h>
00008 #include <list>
00009 #include <vector>
00010 
00011 class ActData{
00012 public:
00013         int mode;
00014         double val;
00015         ActData() { mode = -1; val = 0.0; };
00016         ~ActData(){};
00017 };
00018 
00019 using namespace std;
00020 
00021 class ModeData{
00022 
00023 private:
00024         int mode;
00025         double mean;
00026         double varience;
00027         double meanSquare;
00028         std::vector< double > List;
00029         std::vector< double > squareList;
00030         float m_max; 
00031         float m_min;
00032 
00033 public:
00034         ModeData() {
00035                 mode = -1;
00036                 mean = 0;
00037                 varience = 0;
00038                 meanSquare = 0;
00039                 m_max = -5000.0;
00040                 m_min = 5000.0;
00041         };
00042         ModeData(std::vector< ActData > data, int _mode) {
00043                 mode = _mode;
00044                 m_max = -5000.0;
00045                 m_min = 5000.0;
00046                 int dataSize = data.size();
00047                 for (int i = 0; i < dataSize; i++) {
00048                         if (data[i].mode == mode) {
00049                                 double val = data[i].val;
00050                                 mean += val;
00051                                 meanSquare += val*val;
00052                                 squareList.push_back(val*val);
00053                                 List.push_back(val);
00054                                 m_max = max(m_max, val);
00055                                 m_min = min(m_min, val);
00056                         }
00057                 }
00058                 mean /= List.size();
00059                 meanSquare /= squareList.size();
00060                 setVarience();
00061         };
00062         //Copy Constructor
00063         ModeData(const ModeData &_data) {
00064                 mode = _data.mode;
00065                 mean = _data.mean;
00066                 m_max = _data.m_max;
00067                 m_min = _data.m_min;
00068                 meanSquare = _data.meanSquare;
00069                 varience = _data.varience;
00070                 List = _data.List;
00071                 squareList = _data.squareList;
00072         };
00073 
00074 
00075 
00076         ~ModeData(){squareList.clear(); List.clear();};
00077 
00078         inline double getMean() {return mean;};
00079         inline double getMin() {return m_min;};
00080         inline double getMax() {return m_max;};
00081         inline double getVarience() { return varience; };
00082         inline void setVarience() { varience = meanSquare - (mean*mean); };
00083         inline int getSize() { return List.size(); };
00084 
00085 // ================================================================
00086 
00087         inline int addData(ActData data) { 
00088                 if (mode == data.mode) {
00089                         double SquareListVal = meanSquare*squareList.size();
00090                         double ListVal = mean*List.size();
00091                         squareList.push_back(data.val*data.val);
00092                         List.push_back(data.val);
00093                         meanSquare = (SquareListVal + (data.val*data.val))/squareList.size();
00094                         mean = (ListVal + data.val)/List.size();
00095                         setVarience();
00096                         m_max = max(m_max, data.val);
00097                         m_min = min(m_min, data.val);
00098                         return 1;
00099                 }
00100                 return 0;
00101         };
00102 
00103 // ================================================================
00104 
00105         inline int subData(ActData data) {
00106                 if(data.mode == mode) {
00107                         double val = data.val;
00108                         double squareVal = data.val*data.val;
00109                         double squareListVal = meanSquare * squareList.size();
00110                         double ListVal = mean*List.size();
00111                         std::vector<double>::iterator it = List.begin();
00112                         for (; it != List.end(); ++it) {
00113                                 if(*it == val) {
00114                                         List.erase(it);
00115                                         break;
00116                                 }
00117                         }
00118                         it = squareList.begin();
00119                         for (; it != List.end(); ++it) {
00120                                 if(*it == squareVal) {
00121                                         squareList.erase(it);
00122                                         break;
00123                                 }
00124                         }
00125                         meanSquare = (squareListVal - squareVal)/squareList.size();
00126                         mean = (ListVal - val)/List.size();
00127                         setVarience();
00128                         m_max = max(m_max, data.val);
00129                         m_min = min(m_min, data.val);
00130                         return 1;
00131                 }
00132                 return 0;
00133         };
00134 
00135 // ================================================================
00136 
00137         inline void printData(ofstream &os)
00138         {
00139                 os << "mode = " << mode << endl;
00140                 for(int i = 0; i < List.size(); i++) {
00141                         os << List[i] << "\t";
00142                 }
00143                 os << endl << endl;
00144 
00145         }
00146 
00147 
00148 }; //ModeData
00149 
00150 // ================================================================
00151 // class Cluster
00152 // ================================================================
00153 
00154 class Cluster
00155 {
00156 public:
00157 
00158         Cluster(int _modes = 2) {
00159                 m_modeSize = _modes;
00160                 m_modesSet = m_contData = 0;
00161                 m_suggModeMean.reserve(m_modeSize);
00162                 m_modes.reserve(m_modeSize);
00163 
00164 
00165         } // Constructor
00166         ~Cluster() {
00167                 m_dataList.clear(); 
00168                 m_modes.clear(); 
00169 }       // Destructor
00170 
00171         // ================================================================
00172 
00173         inline double UpdateCluster(double curAct)
00174         {
00175                 float lamda = 0.1f;
00176                 ActData data;
00177                 m_contData = curAct*lamda + (1-lamda)*m_contData;
00178                 data.val = m_contData;
00179                 static int curI = 0;
00180                 int curSize = m_dataList.size();
00181                 if (curSize > 2000) {
00182                         subVal();
00183                         m_dataList.erase(m_dataList.begin());
00184                         curSize--;
00185                 }
00186                 else m_dataList.push_back(data);
00187 
00188                 if (curSize > 150 && !m_modesSet){
00189                         setModes();
00190                         for(int m = 0; m < m_modeSize; m++) {
00191                                 ModeData curMode(m_dataList, m);
00192                                 m_modes[m] = curMode;
00193                         }
00194                         m_modesSet = 1;
00195                 }
00196 
00197                 else if (curI > 500) {
00198                         curI = 0;
00199                         setModes();
00200                         m_modes.clear();
00201                         m_modesSet = 0;
00202                         for(int m = 0; m < m_modeSize; m++) {
00203                                 ModeData curMode(m_dataList, m);
00204                                 m_modes[m] = curMode;
00205                         }
00206                         printData();
00207                         m_modesSet = 2;
00208                 }
00209                 else {
00210                         int closestMode = 0;
00211                         double dist = 100000.0;
00212                         for (int m = 0; m < m_modeSize; m++) {
00213                                 double curDist = data.val - m_suggModeMean[m];
00214                                 if (fabs(curDist) < dist) {
00215                                         dist = fabs(curDist);
00216                                         closestMode = m;
00217                                 }
00218                         }
00219                         data.mode = closestMode;
00220                         m_modes[data.mode].addData(data);
00221                 }
00222 
00223 
00224                 curI++;
00225                 //only works with 2 modes, change later
00226                 if (m_modes.size() > 1)
00227                         m_currThresh = min(m_modes[0].getMax(), m_modes[1].getMax()) - max(m_modes[0].getMin(), m_modes[1].getMin());
00228                 else
00229                         m_currThresh = 0.0;
00230                 return m_currThresh;
00231                 //return (find optimal position);
00232         }
00233 
00234 // ================================================================
00235 
00236 private:
00237 
00238         std::vector < ActData > m_dataList;
00239         std::vector < ModeData > m_modes;
00240         std::vector < double > m_suggModeMean;
00241         double m_min, m_max, m_mean, m_contData;
00242         double m_currThresh;
00243         int m_modesSet, m_modeSize;
00244 
00245 // ================================================================
00246 
00247 
00248         inline int subVal() {
00249                 int mode = m_dataList[0].mode;
00250                 int rtn = m_modes[mode].subData(m_dataList[0]);
00251                 m_dataList.erase(m_dataList.begin());
00252                 return rtn;
00253         }
00254 
00255 // ================================================================
00256 
00257         inline void setModes(int maxTrials = 100) {
00258                 int dataSize = m_dataList.size();
00259                 int i, m, trial = 0;
00260                 int notStable = 1;
00261                 std::vector < double > curModeMean;
00262                 curModeMean.reserve(m_modeSize);
00263                 std::vector < int > curModeSize;
00264                 curModeSize.reserve(m_modeSize);
00265                 while (notStable && trial < maxTrials) {
00266                         for (i = 0; i < dataSize; i++) {
00267                                 int closestMode = 0;
00268                                 double dist = 100000.0;
00269                                 for (m = 0; m < m_modeSize; m++) {
00270                                         double curDist = m_dataList[i].val - m_suggModeMean[m];
00271                                         if (fabs(curDist) < dist) {
00272                                                 dist = fabs(curDist);
00273                                                 closestMode = m;
00274                                                 curModeMean[m] += m_dataList[i].val;
00275                                                 curModeSize[m]++;
00276                                         }
00277                                 }
00278                                 m_dataList[i].mode = closestMode;
00279                         }
00280                         notStable = 0;
00281                         for (m = 0; m < m_modeSize; m++) {
00282                                 double curMean = m_suggModeMean[m];
00283                                 m_suggModeMean[m] = curModeMean[m]/curModeSize[m];
00284                                 if (m_suggModeMean[m] != curMean) notStable++;
00285                         }
00286                         trial++;
00287                 }
00288         }
00289 
00290 
00291 // ================================================================
00292 
00293         inline void printData()
00294         {
00295                 ofstream os;
00296                 os.open("c:\\timedata.out", ios::trunc);
00297                 os << "data size = " << m_dataList.size() << "; Threshold = " << m_currThresh << endl;
00298                 for(int i = 0; i < m_dataList.size(); i++) 
00299                         os << m_dataList[i].val << "\t";
00300                 for(int m = 0; m < m_modeSize; m++) {
00301                         os << "mode = " << m << endl;
00302                         os << "mean = " << m_modes[m].getMean() << "; varience = " << m_modes[m].getVarience() << "; size = " 
00303                            << m_modes[m].getSize() << endl;
00304 
00305                         m_modes[m].printData(os);
00306                 }
00307                 os << endl << endl;
00308                 os.close();
00309 
00310 
00311 
00312         }
00314 
00315 
00316 }; // Cluster
00317 
00318 #endif __CLUSTER_H__

Generated on Mon Nov 8 17:07:31 2004 for MPT by  doxygen 1.3.9.1