00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #ifndef _LTI_LVQ_H_
00034 #define _LTI_LVQ_H_
00035 
00036 #include "ltiVector.h"
00037 #include "ltiMatrix.h"
00038 #include "ltiClassifier.h"
00039 #include "ltiSupervisedInstanceClassifier.h"
00040 #include "ltiStdLayer.h"
00041 
00042 namespace lti {
00043 
00044 
00045 
00046   class lvq : public supervisedInstanceClassifier {
00047   public:
00048 
00049     
00050     
00051     
00052 
00053 
00054 
00055 
00056     class parameters : public supervisedInstanceClassifier::parameters {
00057     public:
00058 
00059 
00060 
00061 
00062       enum eLvqInit {
00063         LvqRand,   
00064         LvqMaxDist 
00065       };
00066 
00067 
00068 
00069 
00070       parameters();
00071 
00072 
00073 
00074 
00075 
00076       parameters(const parameters& other);
00077 
00078 
00079 
00080 
00081       virtual ~parameters();
00082 
00083 
00084 
00085 
00086       const char* getTypeName() const;
00087 
00088 
00089 
00090 
00091 
00092 
00093       parameters& copy(const parameters& other);
00094 
00095 
00096 
00097 
00098 
00099 
00100       inline parameters& operator=(const parameters& other) {
00101         return copy(other);
00102       }
00103 
00104 
00105 
00106 
00107       virtual classifier::parameters* clone() const;
00108 
00109       
00110       
00111       
00112 
00113 
00114 
00115 
00116       double learnRate1;
00117 
00118 
00119 
00120 
00121       double learnRate2;
00122 
00123 
00124 
00125 
00126 
00127       double learnRateFactor;
00128 
00129 
00130 
00131 
00132       double windowSize;
00133 
00134 
00135 
00136 
00137       int nbNeuronsPerClass;
00138 
00139 
00140 
00141 
00142       int nbPresentations1;
00143 
00144 
00145 
00146 
00147       int nbPresentations2;
00148 
00149 
00150 
00151 
00152       eNormType norm;
00153 
00154 
00155 
00156 
00157       eLvqInit initType;
00158 
00159 
00160 
00161 
00162 
00163       bool flagOlvq1;
00164 
00165 
00166 
00167 
00168 
00169       bool flagOlvq3;
00170 
00171 
00172 
00173 
00174       double sigmaFactor;
00175 
00176 
00177 
00178 
00179       bool doStatistics;
00180 
00181 
00182 
00183 
00184       std::string statisticsFilename;
00185 
00186 
00187 
00188 
00189       std::string netFilename;
00190 
00191 
00192 
00193 
00194       bool doTrain2;
00195 
00196 
00197 
00198 
00199       bool saveBest;
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207       bool correctVs3Best;
00208     };
00209 
00210     
00211     
00212     
00213 
00214 
00215 
00216 
00217     class layer : public stdLayer {
00218     public:
00219 
00220 
00221 
00222       layer(const std::string& theName = "LVQ Layer");
00223 
00224 
00225 
00226 
00227       virtual ~layer() {};
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235       void findSigmas(const int& nbNeurCl,
00236                       const double& sigFac,
00237                       dvector& sigma);
00238 
00239     };
00240 
00241     
00242     
00243     
00244 
00245 
00246 
00247 
00248     class trainFunctor : public stdLayer::trainFunctor {
00249     public:
00250 
00251 
00252 
00253 
00254       trainFunctor(const stdLayer::distancePropFunctor& theProp)
00255         : prop(theProp), firstUse(true) {};
00256 
00257 
00258 
00259 
00260       virtual void setLearnFactor(const double& lrFac);
00261 
00262 
00263 
00264 
00265       virtual void setWindowSize(const double& winSize);
00266 
00267     protected:
00268 
00269 
00270 
00271       stdLayer::distancePropFunctor prop;
00272 
00273 
00274 
00275 
00276       dvector delta;
00277 
00278 
00279 
00280 
00281       dvector delta2;
00282 
00283 
00284 
00285 
00286       ivector calls;
00287 
00288 
00289 
00290 
00291       double learnFactor;
00292 
00293 
00294 
00295 
00296       double windowSize;
00297 
00298 
00299 
00300 
00301       bool firstUse;
00302 
00303 
00304 
00305 
00306 
00307       void twoMinIndex(const dvector& vct,int& min1,int& min2);
00308 
00309     };
00310 
00311 
00312 
00313 
00314     class lvq1TrainFunctor : public trainFunctor {
00315     public:
00316 
00317 
00318 
00319 
00320       lvq1TrainFunctor(stdLayer::distancePropFunctor& theProp)
00321         : trainFunctor(theProp) {};
00322 
00323 
00324 
00325 
00326       virtual bool operator()(const dvector& input,
00327                               dmatrix& weights,
00328                               dvector& outLayer,
00329                               const ivector& outID,
00330                               const int& trainID,
00331                               bool& modified);
00332     };
00333 
00334 
00335 
00336 
00337     class olvq1TrainFunctor : public trainFunctor {
00338     public:
00339 
00340 
00341 
00342       olvq1TrainFunctor(stdLayer::distancePropFunctor& theProp)
00343         : trainFunctor(theProp) {};
00344 
00345 
00346 
00347 
00348       void setLearnRate(const double &theLr);
00349 
00350 
00351 
00352 
00353       bool operator()(const dvector& input,
00354                       dmatrix& weights,
00355                       dvector& outLayer,
00356                       const ivector& outID,
00357                       const int& trainID,
00358                       bool& modified);
00359 
00360     protected:
00361 
00362 
00363 
00364       dvector lr;
00365     };
00366 
00367 
00368 
00369 
00370     class lvq3TrainFunctor : public trainFunctor {
00371     public:
00372 
00373 
00374 
00375       lvq3TrainFunctor(stdLayer::distancePropFunctor& theProp)
00376         : trainFunctor(theProp) {};
00377 
00378 
00379 
00380 
00381       bool operator()(const dvector& input,
00382                       dmatrix& weights,
00383                       dvector& outLayer,
00384                       const ivector& outID,
00385                       const int& trainID,
00386                       bool& modified);
00387 
00388 
00389     };
00390 
00391 
00392 
00393 
00394     class olvq3TrainFunctor : public trainFunctor {
00395     public:
00396 
00397 
00398 
00399       olvq3TrainFunctor(stdLayer::distancePropFunctor& theProp)
00400         : trainFunctor(theProp) {};
00401 
00402 
00403 
00404 
00405       void setLearnRate(const double &lRate);
00406 
00407 
00408 
00409 
00410       bool operator()(const dvector& input,
00411                       dmatrix& weights,
00412                       dvector& outLayer,
00413                       const ivector& outID,
00414                       const int& trainID,
00415                       bool& modified);
00416     protected:
00417 
00418 
00419 
00420       dvector lr;
00421 
00422     };
00423 
00424 
00425 
00426 
00427     class lvq4TrainFunctor : public trainFunctor {
00428     public:
00429 
00430 
00431 
00432       lvq4TrainFunctor(stdLayer::distancePropFunctor& theProp)
00433         : trainFunctor(theProp) {};
00434 
00435 
00436 
00437 
00438       bool operator()(const dvector& input,
00439                       dmatrix& weights,
00440                       dvector& outLayer,
00441                       const ivector& outID,
00442                       const int& trainID,
00443                       bool& modified);
00444     };
00445 
00446     
00447     
00448     
00449 
00450 
00451 
00452 
00453     class randInitFunctor : public stdLayer::initFunctor {
00454     public:
00455 
00456 
00457 
00458 
00459       randInitFunctor(const dmatrix& theFeatures,
00460                       const ivector& theTrainIDs,
00461                       const ivector& theNbViewsObj,
00462                       const int& theNbObj,
00463                       const int& theNbNeurObj);
00464 
00465       bool operator()(dmatrix& weights, ivector& outID);
00466 
00467     protected:
00468 
00469 
00470 
00471       const dmatrix& features;
00472 
00473 
00474 
00475 
00476       const ivector& trainIDs;
00477 
00478 
00479 
00480 
00481       const ivector& nbViewsObj;
00482 
00483 
00484 
00485 
00486       const int& nbObj;
00487 
00488 
00489 
00490 
00491       const int& nbNeurObj;
00492     };
00493 
00494 
00495 
00496 
00497     class maxDistInitFunctor : public stdLayer::initFunctor {
00498     public:
00499 
00500 
00501 
00502 
00503       maxDistInitFunctor(const dmatrix& theFeatures,
00504                          const ivector& theTrainIDs,
00505                          const ivector& theNbViewsObj,
00506                          const int& theNbObj,
00507                          const int& theNbNeurObj,
00508                          const eNormType& theNorm);
00509 
00510       bool operator()(dmatrix& weights, ivector& outID);
00511 
00512     protected:
00513 
00514 
00515 
00516       const dmatrix& features;
00517 
00518 
00519 
00520 
00521       const ivector& trainIDs;
00522 
00523 
00524 
00525 
00526       const ivector& nbViewsObj;
00527 
00528 
00529 
00530 
00531       const int& nbObj;
00532 
00533 
00534 
00535 
00536       const int& nbNeurObj;
00537 
00538 
00539 
00540 
00541       const eNormType& norm;
00542     };
00543 
00544     
00545     
00546     
00547 
00548 
00549 
00550 
00551     lvq();
00552 
00553 
00554 
00555 
00556     lvq(const lvq& other);
00557 
00558 
00559 
00560 
00561 
00562     ~lvq();
00563 
00564 
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572 
00573     bool train(const dmatrix& input,
00574                const ivector& ids);
00575 
00576 
00577 
00578 
00579 
00580     bool classify(const dvector& featurem, outputVector& result) const;
00581 
00582 
00583 
00584 
00585     inline int getDimOutputLayer() const;
00586 
00587 
00588 
00589 
00590     void setTestSet(const dmatrix& input,
00591                     const ivector& ids);
00592 
00593 
00594 
00595 
00596     void setTrainSet2(const dmatrix& input,
00597                       const ivector& ids);
00598 
00599 
00600 
00601 
00602     void calcObjProbs(const ivector& ids,
00603                       const dmatrix& feats,
00604                       stdLayer::distancePropFunctor& distProp);
00605 
00606 
00607 
00608 
00609 
00610 
00611     lvq& copy(const lvq& other);
00612 
00613 
00614 
00615 
00616 
00617 
00618     inline lvq& operator=(const lvq& other) {
00619       return copy(other);
00620     }
00621 
00622 
00623 
00624 
00625     virtual classifier* clone() const;
00626 
00627 
00628 
00629 
00630     const parameters& getParameters() const;
00631 
00632 
00633 #ifdef _INCLUDE_DEPRECATED
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 #endif
00644 
00645   protected:
00646 
00647 
00648 
00649 
00650 
00651 
00652   private:
00653 
00654 
00655 
00656     layer lvqLayer;
00657 
00658 
00659 
00660 
00661     stdLayer::distancePropFunctor* distProp;
00662 
00663 
00664 
00665 
00666     layer::linearActFunctor linearAct;
00667 
00668 
00669 
00670 
00671     stdLayer::gaussActFunctor* gaussAct;
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686     int sizeIn;
00687 
00688 
00689 
00690 
00691     int nbObj;
00692 
00693 
00694 
00695 
00696     dmatrix features;
00697 
00698 
00699 
00700 
00701     dvector sigma;
00702 
00703 
00704 
00705 
00706     ivector internToReal;
00707 
00708 
00709 
00710 
00711     std::map<int,int> realToIntern;
00712 
00713 
00714 
00715 
00716 
00717     ivector trainID;
00718 
00719 
00720 
00721 
00722     dmatrix train2Features;
00723 
00724 
00725 
00726 
00727     ivector train2IDs;
00728 
00729 
00730 
00731 
00732 
00733     dmatrix testFeatures;
00734 
00735 
00736 
00737 
00738     ivector testIDs;
00739 
00740 
00741 
00742 
00743 
00744 
00745 
00746 
00747 
00748 
00749 
00750 
00751 
00752   };
00753 
00754 
00755 
00756 
00757   int lvq::getDimOutputLayer() const {
00758     return nbObj*getParameters().nbNeuronsPerClass;
00759   }
00760 }
00761 
00762 #endif //_LTI_LVQ_H_