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_