This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch upstream-master
in repository pktools.

commit 57c68847976133e320169060e5be5663920cb6d7
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Fri Jan 18 09:30:14 2013 +0100

    reclass function in pkclassify_nn.cc and pkclassify_svm.cc
---
 src/apps/pkclassify_nn.cc  | 191 +++++++++++++++++++++------------------------
 src/apps/pkclassify_svm.cc | 160 ++++++++++++++++---------------------
 2 files changed, 157 insertions(+), 194 deletions(-)

diff --git a/src/apps/pkclassify_nn.cc b/src/apps/pkclassify_nn.cc
index 983e2c5..1c56084 100644
--- a/src/apps/pkclassify_nn.cc
+++ b/src/apps/pkclassify_nn.cc
@@ -34,11 +34,57 @@ along with pktools.  If not, see 
<http://www.gnu.org/licenses/>.
 #include <config.h>
 #endif
 
+void reclass(const vector<float>& result, const vector<int>& vreclass, const 
vector<double>& priors, unsigned short aggregation, vector<float>& 
theResultReclass);
+
+void reclass(const vector<float>& result, const vector<int>& vreclass, const 
vector<double>& priors, unsigned short aggregation, vector<float>& 
theResultReclass){
+  unsigned int nclass=result.size();
+  assert(priors.size()==nclass);
+  assert(theResultReclass.size()>1);//must have size nreclass!
+  unsigned int nreclass=theResultReclass.size();
+  vector<float> pValues(nclass);
+  float normReclass=0;
+  for(int iclass=0;iclass<nclass;++iclass){
+    float pv=(result[iclass]+1.0)/2.0;//bring back to scale [0,1]
+    assert(pv>=0);
+    assert(pv<=1);
+    pv*=priors[iclass];
+    pValues[iclass]=pv;
+  }
+  for(int iclass=0;iclass<nreclass;++iclass){
+    theResultReclass[iclass]=0;
+    float maxPaggreg=0;
+    for(int ic=0;ic<nclass;++ic){
+      if(vreclass[ic]==iclass){
+       switch(aggregation){
+       default:
+       case(1)://sum rule (sum posterior probabilities of aggregated 
individual classes)
+         theResultReclass[iclass]+=pValues[ic];
+       break;
+       case(0):
+       case(2)://max rule (look for maximum post probability of aggregated 
individual classes)
+         if(pValues[ic]>maxPaggreg){
+           maxPaggreg=pValues[ic];
+           theResultReclass[iclass]=maxPaggreg;
+         }
+       break;
+       }
+      }
+    }
+    normReclass+=theResultReclass[iclass];
+  }
+  for(int iclass=0;iclass<nreclass;++iclass){
+    float prv=theResultReclass[iclass];
+    prv/=normReclass;
+    theResultReclass[iclass]=prv;
+  }
+}
+
 int main(int argc, char *argv[])
 {
   map<short,int> reclassMap;
   vector<int> vreclass;
   vector<double> priors;
+  vector<double> priorsReclass;
   
   //--------------------------- command line options 
------------------------------------
 
@@ -52,8 +98,8 @@ int main(int argc, char *argv[])
   Optionpk<bool> license_opt("lic","license","show license information",false);
   Optionpk<bool> help_opt("h","help","shows this help info",false);
   Optionpk<bool> todo_opt("\0","todo","",false);
-  Optionpk<string> input_opt("i", "input", "input image",""); 
-  Optionpk<string> training_opt("t", "training", "training shape file. A 
single shape file contains all training features (must be set as: B0, B1, 
B2,...) for all classes (class numbers identified by label option). Use 
multiple training files for bootstrap aggregation (alternative to the bag and 
bsize options, where a random subset is taken from a single training 
file)",""); 
+  Optionpk<string> input_opt("i", "input", "input image"); 
+  Optionpk<string> training_opt("t", "training", "training shape file. A 
single shape file contains all training features (must be set as: B0, B1, 
B2,...) for all classes (class numbers identified by label option). Use 
multiple training files for bootstrap aggregation (alternative to the bag and 
bsize options, where a random subset is taken from a single training file)"); 
   Optionpk<string> label_opt("\0", "label", "identifier for class label in 
training shape file. (default is label)","label"); 
   Optionpk<unsigned short> reclass_opt("\0", "rc", "reclass code (e.g. --rc=12 
--rc=23 to reclass first two classes to 12 and 23 resp.). Default is 0: do not 
reclass", 0);
   Optionpk<unsigned int> balance_opt("\0", "balance", "balance the input data 
to this number of samples for each class (default 0: do not balance)", 0);
@@ -63,7 +109,7 @@ int main(int argc, char *argv[])
   Optionpk<short> band_opt("b", "band", "band index (starting from 0, either 
use band option or use start to end)");
   Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral 
band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
   Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral 
band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale 
min and max in each band to -1.0 and 1.0)", 0.0);
-  Optionpk<unsigned short> aggreg_opt("a", "aggreg", "how to combine 
aggregated classifiers, see also rc option (0: sum rule, 1: max rule). Default 
is max rule (1)",1); 
+  Optionpk<unsigned short> aggreg_opt("a", "aggreg", "how to combine 
aggregated classifiers, see also rc option (1: sum rule, 2: max rule).",1);
   Optionpk<double> priors_opt("p", "prior", "prior probabilities for each 
class (e.g., -p 0.3 -p 0.3 -p 0.2 ), default set to equal priors)", 0.0); 
   Optionpk<unsigned short> cv_opt("cv", "cv", "n-fold cross validation 
mode",0);
   Optionpk<unsigned int> nneuron_opt("\0", "nneuron", "number of neurons in 
hidden layers in neural network (multiple hidden layers are set by defining 
multiple number of neurons: -n 15 -n 1, default is one hidden layer with 5 
neurons)", 5); 
@@ -74,16 +120,16 @@ int main(int argc, char *argv[])
   Optionpk<unsigned short> comb_opt("c", "comb", "how to combine bootstrap 
aggregation classifiers (0: sum rule, 1: product rule, 2: max rule). Also used 
to aggregate classes with rc option. Default is sum rule (0)",0); 
   Optionpk<unsigned short> bag_opt("\0", "bag", "Number of bootstrap 
aggregations (default is no bagging: 1)", 1);
   Optionpk<int> bagSize_opt("\0", "bsize", "Percentage of features used from 
available training features for each bootstrap aggregation (default for no 
bagging: 100)", 100);
-  Optionpk<string> classBag_opt("\0", "class", "output for each individual 
bootstrap aggregation (default is blank)",""); 
-  Optionpk<string> mask_opt("\0", "mask", "mask image (see also mvalue option 
(default is no mask)",""); 
+  Optionpk<string> classBag_opt("\0", "class", "output for each individual 
bootstrap aggregation (default is blank)"); 
+  Optionpk<string> mask_opt("\0", "mask", "mask image (see also mvalue option 
(default is no mask)"); 
   Optionpk<short> maskValue_opt("\0", "mvalue", "mask value(s) not to consider 
for classification (use negative values if only these values should be taken 
into account). Values will be taken over in classification image. Default is 
0", 0);
   Optionpk<unsigned short> flag_opt("f", "flag", "flag to put where image is 
invalid. Default is 0", 0);
-  Optionpk<string> output_opt("o", "output", "output classification 
image",""); 
-  Optionpk<string>  otype_opt("ot", "otype", "Data type for output image 
({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}).
 Empty string: inherit type from input image", "");
-  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see 
also gdal_translate). Empty string: inherit from input image", "");
+  Optionpk<string> output_opt("o", "output", "output classification image"); 
+  Optionpk<string>  otype_opt("ot", "otype", "Data type for output image 
({Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/CInt16/CInt32/CFloat32/CFloat64}).
 Empty string: inherit type from input image");
+  Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see 
also gdal_translate). Empty string: inherit from input image");
   Optionpk<string> option_opt("co", "co", "options: NAME=VALUE [-co 
COMPRESS=LZW] [-co INTERLEAVE=BAND]");
-  Optionpk<string> colorTable_opt("\0", "ct", "colour table in ascii format 
having 5 columns: id R G B ALFA (0: transparent, 255: solid)",""); 
-  Optionpk<string> prob_opt("\0", "prob", "probability image. Default is no 
probability image",""); 
+  Optionpk<string> colorTable_opt("\0", "ct", "colour table in ascii format 
having 5 columns: id R G B ALFA (0: transparent, 255: solid)"); 
+  Optionpk<string> prob_opt("\0", "prob", "probability image. Default is no 
probability image"); 
   Optionpk<short> verbose_opt("v", "verbose", "set to: 0 (results only), 1 
(confusion matrix), 2 (debug)",0);
 
   version_opt.retrieveOption(argc,argv);
@@ -141,9 +187,9 @@ int main(int argc, char *argv[])
 
   if(verbose_opt[0]>=1){
     cout << "image filename: " << input_opt[0] << endl;
-    if(mask_opt[0]!="")
+    if(mask_opt.size())
       cout << "mask filename: " << mask_opt[0] << endl;
-    if(training_opt[0]!=""){
+    if(training_opt.size()){
       cout << "training shape file: " << endl;
       for(int ifile=0;ifile<training_opt.size();++ifile)
         cout << training_opt[ifile] << endl;
@@ -252,11 +298,11 @@ int main(int argc, char *argv[])
       }
       if(!ibag){
         nclass=trainingPixels.size();
-        
nband=(training_opt[0]!="")?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();//X
 and Y
+        
nband=(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size();//X
 and Y
       }
       else{
         assert(nclass==trainingPixels.size());
-        
assert(nband==(training_opt[0]!="")?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());
+        
assert(nband==(training_opt.size())?trainingPixels[0][0].size()-2:trainingPixels[0][0].size());
       }
       assert(reclassMap.size()==nclass);
 
@@ -388,6 +434,15 @@ int main(int argc, char *argv[])
       }
       assert(priors_opt.size()==1||priors_opt.size()==nclass);
     
+      priorsReclass.resize(nreclass);
+      for(int iclass=0;iclass<nreclass;++iclass){
+       priorsReclass[iclass]=0;
+       for(int ic=0;ic<nclass;++ic){
+         if(vreclass[ic]==iclass)
+           priorsReclass[iclass]+=priors[ic];
+       }
+      }
+
       if(verbose_opt[0]>=1){
         cout << "number of bands: " << nband << endl;
         cout << "number of classes: " << nclass << endl;
@@ -562,7 +617,7 @@ int main(int argc, char *argv[])
       exit(2);
     }
     ImgReaderGdal maskReader;
-    if(mask_opt[0]!=""){
+    if(mask_opt.size()){
       try{
         if(verbose_opt[0]>=1)
           cout << "opening mask image file " << mask_opt[0] << endl;
@@ -593,13 +648,13 @@ int main(int argc, char *argv[])
     ImgWriterGdal classImageOut;
     ImgWriterGdal probImage;
     string imageType=testImage.getImageType();
-    if(oformat_opt[0]!="")//default
+    if(oformat_opt.size())//default
       imageType=oformat_opt[0];
     try{
 
       if(verbose_opt[0]>=1)
         cout << "opening class image for writing output " << output_opt[0] << 
endl;
-      if(classBag_opt[0]!=""){
+      if(classBag_opt.size()){
         
classImageBag.open(output_opt[0],ncol,nrow,nbag,GDT_Byte,imageType,option_opt);
         classImageBag.copyGeoTransform(testImage);
         classImageBag.setProjection(testImage.getProjection());
@@ -607,9 +662,9 @@ int main(int argc, char *argv[])
       
classImageOut.open(output_opt[0],ncol,nrow,1,GDT_Byte,imageType,option_opt);
       classImageOut.copyGeoTransform(testImage);
       classImageOut.setProjection(testImage.getProjection());
-      if(colorTable_opt[0]!="")
+      if(colorTable_opt.size())
         classImageOut.setColorTable(colorTable_opt[0],0);
-      if(prob_opt[0]!=""){
+      if(prob_opt.size()){
         
probImage.open(prob_opt[0],ncol,nrow,nreclass,GDT_Byte,imageType,option_opt);
         probImage.copyGeoTransform(testImage);
         probImage.setProjection(testImage.getProjection());
@@ -628,13 +683,13 @@ int main(int argc, char *argv[])
     for(int iline=0;iline<nrow;++iline){
       vector<float> buffer(ncol);
       vector<short> lineMask;
-      if(mask_opt[0]!="")
+      if(mask_opt.size())
         lineMask.resize(maskReader.nrOfCol());
       Vector2d<float> hpixel(ncol);
       Vector2d<float> fpixel(ncol);
       Vector2d<float> prOut(nreclass,ncol);//posterior prob for each reclass
       Vector2d<char> classBag;//classified line for writing to image file
-      if(classBag_opt[0]!="")
+      if(classBag_opt.size())
         classBag.resize(nbag,ncol);
       //read all bands of all pixels in this line in hline
       try{
@@ -732,7 +787,7 @@ int main(int argc, char *argv[])
             }
           }
           if(masked){
-            if(classBag_opt[0]!="")
+            if(classBag_opt.size())
               for(int ibag=0;ibag<nbag;++ibag)
                 classBag[ibag][icol]=theMask;
             classOut[icol]=theMask;
@@ -747,7 +802,7 @@ int main(int argc, char *argv[])
           }
         }
         if(!valid){
-          if(classBag_opt[0]!="")
+          if(classBag_opt.size())
             for(int ibag=0;ibag<nbag;++ibag)
               classBag[ibag][icol]=flag_opt[0];
           classOut[icol]=flag_opt[0];
@@ -767,50 +822,16 @@ int main(int argc, char *argv[])
           float maxP=0;
           vector<float> pValues(nclass);
           vector<float> prValues(nreclass);
-          vector<float> priorsReclass(nreclass);
-          for(int iclass=0;iclass<nclass;++iclass){
-            float pv=(result[iclass]+1.0)/2.0;//bring back to scale [0,1]
-            pv*=priors[iclass];
-            pValues[iclass]=pv;
-          }
-          float normReclass=0;
-          for(int iclass=0;iclass<nreclass;++iclass){
-            prValues[iclass]=0;
-            priorsReclass[iclass]=0;
-            float maxPaggreg=0;
-            for(int ic=0;ic<nclass;++ic){
-              if(vreclass[ic]==iclass){
-                priorsReclass[iclass]+=priors[ic];
-                switch(aggreg_opt[0]){
-                default:
-                case(0)://sum rule (sum posterior probabilities of aggregated 
individual classes)
-                  prValues[iclass]+=pValues[ic];
-                  break;
-                case(1)://max rule (look for maximum post probability of 
aggregated individual classes)
-                  if(pValues[ic]>maxPaggreg){
-                    maxPaggreg=pValues[ic];
-                    prValues[iclass]=maxPaggreg;
-                  }
-                  break;
-                }
-              }
-            }
-          }
-        
-          for(int iclass=0;iclass<nreclass;++iclass)
-            normReclass+=prValues[iclass];
-        
+
+         reclass(result,vreclass,priors,aggreg_opt[0],prValues);
+
           //calculate posterior prob of bag 
-          if(classBag_opt[0]!=""){
+          if(classBag_opt.size()){
             //search for max prob within bag
             maxP=0;
             classBag[ibag][icol]=0;
           }
           for(int iclass=0;iclass<nreclass;++iclass){
-            float prv=prValues[iclass];
-            prv/=normReclass;
-            //           prv*=100.0;
-            prValues[iclass]=prv;
             switch(comb_opt[0]){
             default:
             case(0)://sum rule
@@ -824,7 +845,7 @@ int main(int argc, char *argv[])
                 prOut[iclass][icol]=prValues[iclass];
               break;
             }
-            if(classBag_opt[0]!=""){
+            if(classBag_opt.size()){
               //search for max prob within bag
               if(prValues[iclass]>maxP){
                 maxP=prValues[iclass];
@@ -853,10 +874,10 @@ int main(int argc, char *argv[])
         }
       }//icol
       //----------------------------------- write output 
------------------------------------------
-      if(classBag_opt[0]!="")
+      if(classBag_opt.size())
         for(int ibag=0;ibag<nbag;++ibag)
           classImageBag.writeData(classBag[ibag],GDT_Byte,iline,ibag);
-      if(prob_opt[0]!=""){
+      if(prob_opt.size()){
         for(int iclass=0;iclass<nreclass;++iclass)
           probImage.writeData(prOut[iclass],GDT_Float32,iline,iclass);
       }
@@ -867,9 +888,9 @@ int main(int argc, char *argv[])
       }
     }
     testImage.close();
-    if(prob_opt[0]!="")
+    if(prob_opt.size())
       probImage.close();
-    if(classBag_opt[0]!="")
+    if(classBag_opt.size())
       classImageBag.close();
     classImageOut.close();
   }
@@ -928,43 +949,11 @@ int main(int argc, char *argv[])
           float maxP=0;
           vector<float> pValues(nclass);
           vector<float> prValues(nreclass);
-          vector<float> priorsReclass(nreclass);
-          for(int iclass=0;iclass<nclass;++iclass){
-            float pv=(result[iclass]+1.0)/2.0;//bring back to scale [0,1]
-            pv*=priors[iclass];
-            pValues[iclass]=pv;
-          }
-          float normReclass=0;
-          for(int iclass=0;iclass<nreclass;++iclass){
-            prValues[iclass]=0;
-            priorsReclass[iclass]=0;
-            float maxPaggreg=0;
-            for(int ic=0;ic<nclass;++ic){
-              if(vreclass[ic]==iclass){
-                priorsReclass[iclass]+=priors[ic];
-                switch(aggreg_opt[0]){
-                default:
-                case(0)://sum rule (sum posterior probabilities of aggregated 
individual classes)
-                  prValues[iclass]+=pValues[ic];
-                  break;
-                case(1)://max rule (look for maximum post probability of 
aggregated individual classes)
-                  if(pValues[ic]>maxPaggreg){
-                    maxPaggreg=pValues[ic];
-                    prValues[iclass]=maxPaggreg;
-                  }
-                  break;
-                }
-              }
-            }
-          }
-          for(int iclass=0;iclass<nreclass;++iclass)
-            normReclass+=prValues[iclass];
+
+         reclass(result,vreclass,priors,aggreg_opt[0],prValues);
+
           //calculate posterior prob of bag 
           for(int iclass=0;iclass<nreclass;++iclass){
-            float prv=prValues[iclass];
-            prv/=normReclass;
-            //           prv*=100.0;
-            prValues[iclass]=prv;
             switch(comb_opt[0]){
             default:
             case(0)://sum rule
diff --git a/src/apps/pkclassify_svm.cc b/src/apps/pkclassify_svm.cc
index 8543b7e..9377fc6 100644
--- a/src/apps/pkclassify_svm.cc
+++ b/src/apps/pkclassify_svm.cc
@@ -35,11 +35,57 @@ along with pktools.  If not, see 
<http://www.gnu.org/licenses/>.
 
 #define Malloc(type,n) (type *)malloc((n)*sizeof(type))
 
+void reclass(const vector<double>& result, const vector<int>& vreclass, const 
vector<double>& priors, unsigned short aggregation, vector<float>& 
theResultReclass);
+
+void reclass(const vector<double>& result, const vector<int>& vreclass, const 
vector<double>& priors, unsigned short aggregation, vector<float>& 
theResultReclass){
+  unsigned int nclass=result.size();
+  assert(priors.size()==nclass);
+  assert(theResultReclass.size()>1);//must have size nreclass!
+  unsigned int nreclass=theResultReclass.size();
+  vector<float> pValues(nclass);
+  float normReclass=0;
+  for(int iclass=0;iclass<nclass;++iclass){
+    float pv=result[iclass];//todo: check if result from svm is [0,1]
+    assert(pv>=0);
+    assert(pv<=1);
+    pv*=priors[iclass];
+    pValues[iclass]=pv;
+  }
+  for(int iclass=0;iclass<nreclass;++iclass){
+    theResultReclass[iclass]=0;
+    float maxPaggreg=0;
+    for(int ic=0;ic<nclass;++ic){
+      if(vreclass[ic]==iclass){
+       switch(aggregation){
+       default:
+       case(1)://sum rule (sum posterior probabilities of aggregated 
individual classes)
+         theResultReclass[iclass]+=pValues[ic];
+       break;
+       case(0):
+       case(2)://max rule (look for maximum post probability of aggregated 
individual classes)
+         if(pValues[ic]>maxPaggreg){
+           maxPaggreg=pValues[ic];
+           theResultReclass[iclass]=maxPaggreg;
+         }
+       break;
+       }
+      }
+    }
+    normReclass+=theResultReclass[iclass];
+  }
+  for(int iclass=0;iclass<nreclass;++iclass){
+    float prv=theResultReclass[iclass];
+    prv/=normReclass;
+    theResultReclass[iclass]=prv;
+  }
+}
+
 int main(int argc, char *argv[])
 {
   map<short,int> reclassMap;
-  vector<int> vreclass;
+  vector<int> vreclass;          //vreclass: map nclass->nreclass
   vector<double> priors;
+  vector<double> priorsReclass;
   
   //--------------------------- command line options 
------------------------------------
 
@@ -206,6 +252,7 @@ int main(int argc, char *argv[])
       priors[iclass]/=normPrior;
   }
 
+
   //sort bands
   if(band_opt.size())
     std::sort(band_opt.begin(),band_opt.end());
@@ -410,7 +457,16 @@ int main(int argc, char *argv[])
           priors[iclass]=1.0/nclass;
       }
       assert(priors_opt.size()==1||priors_opt.size()==nclass);
-    
+
+      priorsReclass.resize(nreclass);
+      for(int iclass=0;iclass<nreclass;++iclass){
+       priorsReclass[iclass]=0;
+       for(int ic=0;ic<nclass;++ic){
+         if(vreclass[ic]==iclass)
+           priorsReclass[iclass]+=priors[ic];
+       }
+      }
+
       if(verbose_opt[0]>=1){
         std::cout << "number of bands: " << nband << std::endl;
         std::cout << "number of classes: " << nclass << std::endl;
@@ -522,19 +578,9 @@ int main(int argc, char *argv[])
         
cm.incrementResult(cm.getClass(prob[ibag].y[i]),cm.getClass(target[i]),1);
       assert(cm.nReference());
       std::cout << cm << std::endl;
-      double se95_ua=0;
-      double se95_pa=0;
-      double dua=0;
-      double dpa=0;
+      std::cout << "Kappa: " << cm.kappa() << std::endl;
       double se95_oa=0;
       double doa=0;
-      cout << "class #samples userAcc prodAcc" << endl;
-      for(int iclass=0;iclass<cm.nClasses();++iclass){
-        dua=cm.ua_pct(cm.getClass(iclass),&se95_ua);
-        dpa=cm.pa_pct(cm.getClass(iclass),&se95_pa);
-        cout << cm.getClass(iclass) << " " << 
cm.nReference(cm.getClass(iclass)) << " " << dua << " (" << se95_ua << ")" << " 
" << dpa << " (" << se95_pa << ")" << endl;
-      }
-      std::cout << "Kappa: " << cm.kappa() << std::endl;
       doa=cm.oa_pct(&se95_oa);
       std::cout << "Overall Accuracy: " << doa << " (" << se95_oa << ")"  << 
std::endl;
       free(target);
@@ -762,9 +808,7 @@ int main(int argc, char *argv[])
           // x[fpixel[icol].size()].index=-1;//to end svm feature vector
           x[nband].index=-1;//to end svm feature vector
           double predict_label=0;
-          vector<float> pValues(nclass);
           vector<float> prValues(nreclass);
-          vector<float> priorsReclass(nreclass);
           float maxP=0;
           if(!aggreg_opt[0]){
             predict_label = svm_predict(svm[ibag],x);
@@ -779,40 +823,10 @@ int main(int argc, char *argv[])
             assert(svm_check_probability_model(svm[ibag]));
             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));
           }
-          for(int iclass=0;iclass<nclass;++iclass){
-            float pv=result[iclass];
-            assert(pv>=0);
-            assert(pv<=1);
-            pv*=priors[iclass];
-            pValues[iclass]=pv;
-          }
-          float normReclass=0;
-          for(int iclass=0;iclass<nreclass;++iclass){
-            prValues[iclass]=0;
-            priorsReclass[iclass]=0;
-            float maxPaggreg=0;
-            for(int ic=0;ic<nclass;++ic){
-              if(vreclass[ic]==iclass){
-                priorsReclass[iclass]+=priors[ic];
-                switch(aggreg_opt[0]){
-                default:
-                case(1)://sum rule (sum posterior probabilities of aggregated 
individual classes)
-                  prValues[iclass]+=pValues[ic];
-                break;
-                case(0):
-                case(2)://max rule (look for maximum post probability of 
aggregated individual classes)
-                  if(pValues[ic]>maxPaggreg){
-                    maxPaggreg=pValues[ic];
-                    prValues[iclass]=maxPaggreg;
-                  }
-                  break;
-                }
-              }
-            }
-          }
+
+         reclass(result,vreclass,priors,aggreg_opt[0],prValues);
+         
           for(int iclass=0;iclass<nreclass;++iclass)
-            normReclass+=prValues[iclass];
-        
           //calculate posterior prob of bag 
           if(classBag_opt.size()){
             //search for max prob within bag
@@ -820,10 +834,6 @@ int main(int argc, char *argv[])
             classBag[ibag][icol]=0;
           }
           for(int iclass=0;iclass<nreclass;++iclass){
-            float prv=prValues[iclass];
-            prv/=normReclass;
-            //           prv*=100.0;
-            prValues[iclass]=prv;
             switch(comb_opt[0]){
             default:
             case(0)://sum rule
@@ -924,15 +934,12 @@ int main(int argc, char *argv[])
         
         imgReaderOgr.readData(validationPixel,OFTReal,fields,poFeature);
         OGRFeature::DestroyFeature( poFeature );
-//         assert(validationPixel.size()>=start_opt[0]+nband);
         assert(validationPixel.size()==nband);
         vector<float> prOut(nreclass);//posterior prob for each reclass
         for(int iclass=0;iclass<nreclass;++iclass)
           prOut[iclass]=0;
         for(int ibag=0;ibag<nbag;++ibag){
-//           for(int iband=start_opt[0];iband<start_opt[0]+nband;++iband){
           for(int iband=0;iband<nband;++iband){
-//             
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband-start_opt[0]])/scale[ibag][iband-start_opt[0]]);
             
validationFeature.push_back((validationPixel[iband]-offset[ibag][iband])/scale[ibag][iband]);
             if(verbose_opt[0]==2)
               std::cout << " " << validationFeature.back();
@@ -950,10 +957,8 @@ int main(int argc, char *argv[])
           }
           x[validationFeature.size()].index=-1;//to end svm feature vector
           double predict_label=0;
-          vector<float> pValues(nclass);
+          // vector<float> pValues(nclass);
           vector<float> prValues(nreclass);
-          vector<float> priorsReclass(nreclass);
-          float maxP=0;
           if(!aggreg_opt[0]){
             predict_label = svm_predict(svm[ibag],x);
             for(int iclass=0;iclass<nclass;++iclass){
@@ -967,43 +972,11 @@ int main(int argc, char *argv[])
             assert(svm_check_probability_model(svm[ibag]));
             predict_label = svm_predict_probability(svm[ibag],x,&(result[0]));
           }
-          // int maxClass=0;
-          for(int iclass=0;iclass<nclass;++iclass){
-            float pv=(result[iclass]+1.0)/2.0;//bring back to scale [0,1]
-            pv*=priors[iclass];
-            pValues[iclass]=pv;
-          }
-          float normReclass=0;
-          for(int iclass=0;iclass<nreclass;++iclass){
-            prValues[iclass]=0;
-            priorsReclass[iclass]=0;
-            float maxPaggreg=0;
-            for(int ic=0;ic<nclass;++ic){
-              if(vreclass[ic]==iclass){
-                priorsReclass[iclass]+=priors[ic];
-                switch(aggreg_opt[0]){
-                default:
-                case(0)://sum rule (sum posterior probabilities of aggregated 
individual classes)
-                  prValues[iclass]+=pValues[ic];
-                  break;
-                case(1)://max rule (look for maximum post probability of 
aggregated individual classes)
-                  if(pValues[ic]>maxPaggreg){
-                    maxPaggreg=pValues[ic];
-                    prValues[iclass]=maxPaggreg;
-                  }
-                  break;
-                }
-              }
-            }
-          }
-          for(int iclass=0;iclass<nreclass;++iclass)
-            normReclass+=prValues[iclass];
+
+         reclass(result,vreclass,priors,aggreg_opt[0],prValues);
+
           //calculate posterior prob of bag 
           for(int iclass=0;iclass<nreclass;++iclass){
-            float prv=prValues[iclass];
-            prv/=normReclass;
-            //           prv*=100.0;
-            prValues[iclass]=prv;
             switch(comb_opt[0]){
             default:
             case(0)://sum rule
@@ -1020,6 +993,7 @@ int main(int argc, char *argv[])
           }
           free(x);
         }//for ibag
+
         //search for max class prob
         float maxBag=0;
         float normBag=0;

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/pktools.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to