SHOGUN
v2.0.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 1999-2009 Soeren Sonnenburg 00008 * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society 00009 */ 00010 00011 #include <shogun/machine/OnlineLinearMachine.h> 00012 #include <shogun/base/Parameter.h> 00013 00014 using namespace shogun; 00015 00016 COnlineLinearMachine::COnlineLinearMachine() 00017 : CMachine(), w_dim(0), w(NULL), bias(0), features(NULL) 00018 { 00019 m_parameters->add_vector(&w, &w_dim, "w", "Parameter vector w."); 00020 SG_ADD(&bias, "bias", "Bias b.", MS_NOT_AVAILABLE); 00021 SG_ADD((CSGObject**) &features, "features", 00022 "Feature object.", MS_NOT_AVAILABLE); 00023 } 00024 00025 COnlineLinearMachine::~COnlineLinearMachine() 00026 { 00027 // It is possible that a derived class may have already 00028 // called SG_FREE() on the weight vector 00029 if (w != NULL) 00030 SG_FREE(w); 00031 SG_UNREF(features); 00032 } 00033 00034 CBinaryLabels* COnlineLinearMachine::apply_binary(CFeatures* data) 00035 { 00036 SGVector<float64_t> outputs = apply_get_outputs(data); 00037 return new CBinaryLabels(outputs); 00038 } 00039 00040 CRegressionLabels* COnlineLinearMachine::apply_regression(CFeatures* data) 00041 { 00042 SGVector<float64_t> outputs = apply_get_outputs(data); 00043 return new CRegressionLabels(outputs); 00044 } 00045 00046 SGVector<float64_t> COnlineLinearMachine::apply_get_outputs(CFeatures* data) 00047 { 00048 if (data) 00049 { 00050 if (!data->has_property(FP_STREAMING_DOT)) 00051 SG_ERROR("Specified features are not of type CStreamingDotFeatures\n"); 00052 00053 set_features((CStreamingDotFeatures*) data); 00054 } 00055 00056 ASSERT(features); 00057 ASSERT(features->has_property(FP_STREAMING_DOT)); 00058 00059 DynArray<float64_t>* labels_dynarray=new DynArray<float64_t>(); 00060 int32_t num_labels=0; 00061 00062 features->start_parser(); 00063 while (features->get_next_example()) 00064 { 00065 float64_t current_lab=features->dense_dot(w, w_dim) + bias; 00066 00067 labels_dynarray->append_element(current_lab); 00068 num_labels++; 00069 00070 features->release_example(); 00071 } 00072 features->end_parser(); 00073 00074 SGVector<float64_t> labels_array(num_labels); 00075 for (int32_t i=0; i<num_labels; i++) 00076 labels_array.vector[i]=(*labels_dynarray)[i]; 00077 00078 return labels_array; 00079 } 00080 00081 float32_t COnlineLinearMachine::apply_one(float32_t* vec, int32_t len) 00082 { 00083 return SGVector<float32_t>::dot(vec, w, len)+bias; 00084 } 00085 00086 float32_t COnlineLinearMachine::apply_to_current_example() 00087 { 00088 return features->dense_dot(w, w_dim)+bias; 00089 } 00090 00091 bool COnlineLinearMachine::train_machine(CFeatures *data) 00092 { 00093 if (data) 00094 { 00095 if (!data->has_property(FP_STREAMING_DOT)) 00096 SG_ERROR("Specified features are not of type CStreamingDotFeatures\n"); 00097 set_features((CStreamingDotFeatures*) data); 00098 } 00099 start_train(); 00100 features->start_parser(); 00101 while (features->get_next_example()) 00102 { 00103 train_example(features, features->get_label()); 00104 features->release_example(); 00105 } 00106 00107 features->end_parser(); 00108 stop_train(); 00109 00110 return true; 00111 }