contrib/mul/clsfy/clsfy_knn_builder.cxx

Go to the documentation of this file.
00001 // This is mul/clsfy/clsfy_knn_builder.cxx
00002 // Copyright (c) 2001: British Telecommunications plc
00003 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00004 #pragma implementation
00005 #endif
00006 //:
00007 // \file
00008 // \brief Implement a knn classifier builder
00009 // \author Ian Scott
00010 // \date 2001/10/07
00011 
00012 #include "clsfy_knn_builder.h"
00013 
00014 #include <vcl_iostream.h>
00015 #include <vcl_string.h>
00016 #include <vcl_cassert.h>
00017 #include <vsl/vsl_binary_loader.h>
00018 #include <clsfy/clsfy_k_nearest_neighbour.h>
00019 
00020 //=======================================================================
00021 
00022 clsfy_knn_builder::clsfy_knn_builder():
00023 k_(1)
00024 {
00025 }
00026 
00027 
00028 //=======================================================================
00029 
00030 short clsfy_knn_builder::version_no() const
00031 {
00032   return 1;
00033 }
00034 
00035 //=======================================================================
00036 
00037 vcl_string clsfy_knn_builder::is_a() const
00038 {
00039   return vcl_string("clsfy_knn_builder");
00040 }
00041 
00042 //=======================================================================
00043 
00044 bool clsfy_knn_builder::is_class(vcl_string const& s) const
00045 {
00046   return s == clsfy_knn_builder::is_a() || clsfy_builder_base::is_class(s);
00047 }
00048 
00049 //=======================================================================
00050 
00051 clsfy_builder_base* clsfy_knn_builder::clone() const
00052 {
00053   return new clsfy_knn_builder(*this);
00054 }
00055 
00056 //=======================================================================
00057 
00058 void clsfy_knn_builder::print_summary(vcl_ostream& os) const
00059 {
00060   os << "k = " << k_;
00061 }
00062 
00063 //=======================================================================
00064 
00065 void clsfy_knn_builder::b_write(vsl_b_ostream& bfs) const
00066 {
00067   vsl_b_write(bfs, version_no());
00068   vsl_b_write(bfs, k_);
00069   vcl_cerr << "clsfy_knn_builder::b_write() NYI\n";
00070 }
00071 
00072 //=======================================================================
00073 
00074 void clsfy_knn_builder::b_read(vsl_b_istream& bfs)
00075 {
00076   if (!bfs) return;
00077 
00078   short version;
00079   vsl_b_read(bfs,version);
00080   switch (version)
00081   {
00082   case (1):
00083     vsl_b_read(bfs, k_);
00084     break;
00085   default:
00086     vcl_cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, clsfy_knn_builder&)\n"
00087              << "           Unknown version number "<< version << "\n";
00088     bfs.is().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream
00089   }
00090 }
00091 
00092 //=======================================================================
00093 
00094 //: Build model from data
00095 // return the mean error over the training set.
00096 // For many classifiers, you may use nClasses==1 to
00097 // indicate a binary classifier
00098 double clsfy_knn_builder::build(clsfy_classifier_base& model,
00099                                 mbl_data_wrapper<vnl_vector<double> >& inputs,
00100                                 unsigned /* nClasses */,
00101                                 const vcl_vector<unsigned> &outputs) const
00102 {
00103   assert(model.is_class("clsfy_k_nearest_neighbour")); // equiv to dynamic_cast<> != 0
00104   assert(inputs.size()==outputs.size());
00105 
00106   clsfy_k_nearest_neighbour &knn = (clsfy_k_nearest_neighbour&) model;
00107 
00108   vcl_vector<vnl_vector<double> > vin(inputs.size());
00109 
00110   inputs.reset();
00111   unsigned i=0;
00112   do
00113   {
00114     vin[i++] = inputs.current();
00115   } while (inputs.next());
00116 
00117   assert(i==inputs.size());
00118 
00119   knn.set(vin, outputs);
00120   knn.set_k(k_);
00121   return clsfy_test_error(model, inputs, outputs);
00122 }
00123 
00124 //=======================================================================
00125 
00126 unsigned clsfy_knn_builder::k() const
00127 {
00128   return k_;
00129 }
00130 
00131 //=======================================================================
00132 
00133 void clsfy_knn_builder::set_k(unsigned k)
00134 {
00135   k_ = k;
00136 }
00137 
00138 //=======================================================================
00139 //: Create empty classifier
00140 // Caller is responsible for deletion
00141 clsfy_classifier_base* clsfy_knn_builder::new_classifier() const
00142 {
00143   return new clsfy_k_nearest_neighbour();
00144 }
00145 

Generated on Thu Jan 8 05:11:33 2009 for contrib/mul/clsfy by  doxygen 1.5.1