jubatus_core  0.1.2
Jubatus: Online machine learning framework for distributed environment
Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | List of all members
jubatus::core::classifier::linear_classifier Class Referenceabstract

#include <linear_classifier.hpp>

Inheritance diagram for jubatus::core::classifier::linear_classifier:
Inheritance graph
Collaboration diagram for jubatus::core::classifier::linear_classifier:
Collaboration graph

Public Member Functions

std::string classify (const common::sfv_t &fv) const
 
void classify_with_scores (const common::sfv_t &fv, classify_result &scores) const
 
void clear ()
 
bool delete_label (const std::string &label)
 
std::vector< std::string > get_labels () const
 
framework::mixableget_mixable ()
 
virtual void get_status (std::map< std::string, std::string > &status) const
 
jubatus::util::lang::shared_ptr< unlearner::unlearner_baselabel_unlearner () const
 
 linear_classifier (storage_ptr storage)
 
virtual std::string name () const =0
 
void pack (framework::packer &pk) const
 
bool set_label (const std::string &label)
 
void set_label_unlearner (jubatus::util::lang::shared_ptr< unlearner::unlearner_base > label_unlearner)
 
virtual void train (const common::sfv_t &fv, const std::string &label)=0
 
bool unlearn_label (const std::string &label)
 
void unpack (msgpack::object o)
 
virtual ~linear_classifier ()
 
- Public Member Functions inherited from jubatus::core::classifier::classifier_base
 classifier_base ()
 
virtual ~classifier_base ()
 

Protected Member Functions

float calc_margin (const common::sfv_t &sfv, const std::string &label, std::string &incorrect_label) const
 
float calc_margin_and_variance (const common::sfv_t &sfv, const std::string &label, std::string &incorrect_label, float &variance) const
 
void check_touchable (const std::string &label)
 
std::string get_largest_incorrect_label (const common::sfv_t &sfv, const std::string &label, classify_result &scores) const
 
void touch (const std::string &label)
 
void update_weight (const common::sfv_t &sfv, float step_weigth, const std::string &pos_label, const std::string &neg_class)
 

Static Protected Member Functions

static float squared_norm (const common::sfv_t &sfv)
 

Protected Attributes

framework::linear_function_mixer mixable_storage_
 
storage_ptr storage_
 
jubatus::util::lang::shared_ptr< unlearner::unlearner_baseunlearner_
 

Detailed Description

Definition at line 38 of file linear_classifier.hpp.

Constructor & Destructor Documentation

jubatus::core::classifier::linear_classifier::linear_classifier ( storage_ptr  storage)
explicit

Definition at line 42 of file linear_classifier.cpp.

jubatus::core::classifier::linear_classifier::~linear_classifier ( )
virtual

Definition at line 46 of file linear_classifier.cpp.

46  {
47 }

Member Function Documentation

float jubatus::core::classifier::linear_classifier::calc_margin ( const common::sfv_t sfv,
const std::string &  label,
std::string &  incorrect_label 
) const
protected

Definition at line 151 of file linear_classifier.cpp.

References get_largest_incorrect_label().

Referenced by calc_margin_and_variance(), jubatus::core::classifier::passive_aggressive_1::train(), and jubatus::core::classifier::passive_aggressive_2::train().

154  {
155  classify_result scores;
156  incorrect_label = get_largest_incorrect_label(fv, label, scores);
157  float correct_score = 0.f;
158  float incorrect_score = 0.f;
159  for (vector<classify_result_elem>::const_iterator it = scores.begin();
160  it != scores.end(); ++it) {
161  if (it->label == label) {
162  correct_score = it->score;
163  } else if (it->label == incorrect_label) {
164  incorrect_score = it->score;
165  }
166  }
167  return incorrect_score - correct_score;
168 }
std::vector< classify_result_elem > classify_result
std::string get_largest_incorrect_label(const common::sfv_t &sfv, const std::string &label, classify_result &scores) const

Here is the call graph for this function:

Here is the caller graph for this function:

float jubatus::core::classifier::linear_classifier::calc_margin_and_variance ( const common::sfv_t sfv,
const std::string &  label,
std::string &  incorrect_label,
float &  variance 
) const
protected

Definition at line 170 of file linear_classifier.cpp.

References calc_margin(), and storage_.

Referenced by jubatus::core::classifier::arow::train(), jubatus::core::classifier::normal_herd::train(), and jubatus::core::classifier::confidence_weighted::train().

174  {
175  float margin = calc_margin(sfv, label, incorrect_label);
176  var = 0.f;
177 
178  util::concurrent::scoped_lock lk(storage_->get_lock());
179  for (size_t i = 0; i < sfv.size(); ++i) {
180  const string& feature = sfv[i].first;
181  const float val = sfv[i].second;
182  feature_val2_t weight_covars;
183  storage_->get2_nolock(feature, weight_covars);
184  float label_covar = 1.f;
185  float incorrect_label_covar = 1.f;
186  for (size_t j = 0; j < weight_covars.size(); ++j) {
187  if (weight_covars[j].first == label) {
188  label_covar = weight_covars[j].second.v2;
189  } else if (weight_covars[j].first == incorrect_label) {
190  incorrect_label_covar = weight_covars[j].second.v2;
191  }
192  }
193  var += (label_covar + incorrect_label_covar) * val * val;
194  }
195  return margin;
196 }
std::vector< std::pair< std::string, val2_t > > feature_val2_t
float calc_margin(const common::sfv_t &sfv, const std::string &label, std::string &incorrect_label) const

Here is the call graph for this function:

Here is the caller graph for this function:

void jubatus::core::classifier::linear_classifier::check_touchable ( const std::string &  label)
protected

Definition at line 225 of file linear_classifier.cpp.

References JUBATUS_EXCEPTION, and unlearner_.

Referenced by set_label(), touch(), jubatus::core::classifier::perceptron::train(), jubatus::core::classifier::arow::train(), jubatus::core::classifier::normal_herd::train(), jubatus::core::classifier::confidence_weighted::train(), jubatus::core::classifier::passive_aggressive_1::train(), and jubatus::core::classifier::passive_aggressive_2::train().

225  {
226  if (unlearner_ && !unlearner_->can_touch(label)) {
227  throw JUBATUS_EXCEPTION(common::exception::runtime_error(
228  "no more space available to add new label: " + label));
229  }
230 }
#define JUBATUS_EXCEPTION(e)
Definition: exception.hpp:79
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_

Here is the caller graph for this function:

string jubatus::core::classifier::linear_classifier::classify ( const common::sfv_t fv) const

Definition at line 81 of file linear_classifier.cpp.

References classify_with_scores().

Referenced by jubatus::core::classifier::perceptron::train().

81  {
82  classify_result result;
83  classify_with_scores(fv, result);
84  float max_score = -FLT_MAX;
85  string max_class;
86  for (vector<classify_result_elem>::const_iterator it = result.begin();
87  it != result.end(); ++it) {
88  if (it == result.begin() || it->score > max_score) {
89  max_score = it->score;
90  max_class = it->label;
91  }
92  }
93  return max_class;
94 }
std::vector< classify_result_elem > classify_result
void classify_with_scores(const common::sfv_t &fv, classify_result &scores) const

Here is the call graph for this function:

Here is the caller graph for this function:

void jubatus::core::classifier::linear_classifier::classify_with_scores ( const common::sfv_t fv,
classify_result scores 
) const
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 68 of file linear_classifier.cpp.

References storage_.

Referenced by classify(), and get_largest_incorrect_label().

70  {
71  scores.clear();
72 
74  storage_->inp(sfv, ret);
75  for (map_feature_val1_t::const_iterator it = ret.begin(); it != ret.end();
76  ++it) {
77  scores.push_back(classify_result_elem(it->first, it->second));
78  }
79 }
jubatus::util::data::unordered_map< std::string, val1_t > map_feature_val1_t

Here is the caller graph for this function:

void jubatus::core::classifier::linear_classifier::clear ( )
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 96 of file linear_classifier.cpp.

References storage_, and unlearner_.

96  {
97  storage_->clear();
98  if (unlearner_) {
99  unlearner_->clear();
100  }
101 }
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_
bool jubatus::core::classifier::linear_classifier::delete_label ( const std::string &  label)
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 232 of file linear_classifier.cpp.

References storage_, and unlearner_.

232  {
233  // Remove the label from the model.
234  bool result = storage_->delete_label(label);
235 
236  if (unlearner_ && result) {
237  // Notify unlearner that the label was removed.
238  result = unlearner_->remove(label);
239  }
240 
241  return result;
242 }
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_
vector< string > jubatus::core::classifier::linear_classifier::get_labels ( ) const
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 103 of file linear_classifier.cpp.

References storage_.

103  {
104  return storage_->get_labels();
105 }
string jubatus::core::classifier::linear_classifier::get_largest_incorrect_label ( const common::sfv_t sfv,
const std::string &  label,
classify_result scores 
) const
protected

Definition at line 131 of file linear_classifier.cpp.

References classify_with_scores().

Referenced by calc_margin().

134  {
135  classify_with_scores(fv, scores);
136  float max_score = -FLT_MAX;
137  string max_class;
138  for (vector<classify_result_elem>::const_iterator it = scores.begin();
139  it != scores.end(); ++it) {
140  if (it->label == label) {
141  continue;
142  }
143  if (it->score > max_score || it == scores.begin()) {
144  max_score = it->score;
145  max_class = it->label;
146  }
147  }
148  return max_class;
149 }
void classify_with_scores(const common::sfv_t &fv, classify_result &scores) const

Here is the call graph for this function:

Here is the caller graph for this function:

framework::mixable * jubatus::core::classifier::linear_classifier::get_mixable ( )
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 213 of file linear_classifier.cpp.

References mixable_storage_.

213  {
214  return &mixable_storage_;
215 }
framework::linear_function_mixer mixable_storage_
void jubatus::core::classifier::linear_classifier::get_status ( std::map< std::string, std::string > &  status) const
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 118 of file linear_classifier.cpp.

References storage_.

118  {
119  storage_->get_status(status);
120  status["storage"] = storage_->type();
121 }
jubatus::util::lang::shared_ptr<unlearner::unlearner_base> jubatus::core::classifier::linear_classifier::label_unlearner ( ) const
inline

Definition at line 49 of file linear_classifier.hpp.

References unlearner_.

Referenced by set_label_unlearner().

49  {
50  return unlearner_;
51  }
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_

Here is the caller graph for this function:

virtual std::string jubatus::core::classifier::linear_classifier::name ( ) const
pure virtual
void jubatus::core::classifier::linear_classifier::pack ( framework::packer pk) const
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 206 of file linear_classifier.cpp.

References storage_.

206  {
207  storage_->pack(pk);
208 }
bool jubatus::core::classifier::linear_classifier::set_label ( const std::string &  label)
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 107 of file linear_classifier.cpp.

References check_touchable(), storage_, and unlearner_.

107  {
108  check_touchable(label);
109 
110  bool result = storage_->set_label(label);
111  if (unlearner_ && result) {
112  result = unlearner_->touch(label);
113  }
114 
115  return result;
116 }
void check_touchable(const std::string &label)
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_

Here is the call graph for this function:

void jubatus::core::classifier::linear_classifier::set_label_unlearner ( jubatus::util::lang::shared_ptr< unlearner::unlearner_base label_unlearner)
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 58 of file linear_classifier.cpp.

References label_unlearner(), mixable_storage_, jubatus::core::framework::linear_function_mixer::set_label_unlearner(), and unlearner_.

60  {
61  label_unlearner->set_callback(
62  jubatus::util::lang::bind(
63  delete_label_wrapper, this, jubatus::util::lang::_1));
66 }
void set_label_unlearner(jubatus::util::lang::shared_ptr< unlearner::unlearner_base > label_unlearner)
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > label_unlearner() const
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_
framework::linear_function_mixer mixable_storage_

Here is the call graph for this function:

float jubatus::core::classifier::linear_classifier::squared_norm ( const common::sfv_t sfv)
staticprotected

Definition at line 198 of file linear_classifier.cpp.

Referenced by jubatus::core::classifier::passive_aggressive_1::train(), and jubatus::core::classifier::passive_aggressive_2::train().

198  {
199  float ret = 0.f;
200  for (size_t i = 0; i < fv.size(); ++i) {
201  ret += fv[i].second * fv[i].second;
202  }
203  return ret;
204 }

Here is the caller graph for this function:

void jubatus::core::classifier::linear_classifier::touch ( const std::string &  label)
protected

Definition at line 217 of file linear_classifier.cpp.

References check_touchable(), and unlearner_.

Referenced by jubatus::core::classifier::perceptron::train(), jubatus::core::classifier::passive_aggressive_1::train(), jubatus::core::classifier::passive_aggressive_2::train(), jubatus::core::classifier::arow::update(), jubatus::core::classifier::normal_herd::update(), and jubatus::core::classifier::confidence_weighted::update().

217  {
218  check_touchable(label);
219 
220  if (unlearner_) {
221  unlearner_->touch(label);
222  }
223 }
void check_touchable(const std::string &label)
jubatus::util::lang::shared_ptr< unlearner::unlearner_base > unlearner_

Here is the call graph for this function:

Here is the caller graph for this function:

virtual void jubatus::core::classifier::linear_classifier::train ( const common::sfv_t fv,
const std::string &  label 
)
pure virtual
bool jubatus::core::classifier::linear_classifier::unlearn_label ( const std::string &  label)

Callback function to delete the label via unlearner.

Definition at line 247 of file linear_classifier.cpp.

References storage_.

247  {
248  // this method must be called via touch() function.
249  // touch() must be done with holding lock
250  // so this function must not get lock
251  return storage_->delete_label_nolock(label);
252 }
void jubatus::core::classifier::linear_classifier::unpack ( msgpack::object  o)
virtual

Implements jubatus::core::classifier::classifier_base.

Definition at line 209 of file linear_classifier.cpp.

References storage_.

209  {
210  storage_->unpack(o);
211 }
void jubatus::core::classifier::linear_classifier::update_weight ( const common::sfv_t sfv,
float  step_weigth,
const std::string &  pos_label,
const std::string &  neg_class 
)
protected

Definition at line 123 of file linear_classifier.cpp.

References storage_.

Referenced by jubatus::core::classifier::perceptron::train(), jubatus::core::classifier::passive_aggressive_1::train(), and jubatus::core::classifier::passive_aggressive_2::train().

127  {
128  storage_->bulk_update(sfv, step_width, pos_label, neg_label);
129 }

Here is the caller graph for this function:

Member Data Documentation

framework::linear_function_mixer jubatus::core::classifier::linear_classifier::mixable_storage_
protected

Definition at line 101 of file linear_classifier.hpp.

Referenced by get_mixable(), and set_label_unlearner().

storage_ptr jubatus::core::classifier::linear_classifier::storage_
protected
jubatus::util::lang::shared_ptr<unlearner::unlearner_base> jubatus::core::classifier::linear_classifier::unlearner_
protected

The documentation for this class was generated from the following files: