00001
00002
00003 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00004 #pragma implementation
00005 #endif
00006
00007
00008
00009
00010
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);
00089 }
00090 }
00091
00092
00093
00094
00095
00096
00097
00098 double clsfy_knn_builder::build(clsfy_classifier_base& model,
00099 mbl_data_wrapper<vnl_vector<double> >& inputs,
00100 unsigned ,
00101 const vcl_vector<unsigned> &outputs) const
00102 {
00103 assert(model.is_class("clsfy_k_nearest_neighbour"));
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
00140
00141 clsfy_classifier_base* clsfy_knn_builder::new_classifier() const
00142 {
00143 return new clsfy_k_nearest_neighbour();
00144 }
00145