float classifier_base::calc_margin_and_variance( const common::sfv_t& sfv, const string& label, string& incorrect_label, float& var) const { float margin = calc_margin(sfv, label, incorrect_label); var = 0.f; for (size_t i = 0; i < sfv.size(); ++i) { const string& feature = sfv[i].first; const float val = sfv[i].second; feature_val2_t weight_covars; storage_->get2(feature, weight_covars); float label_covar = 1.f; float incorrect_label_covar = 1.f; for (size_t j = 0; j < weight_covars.size(); ++j) { if (weight_covars[j].first == label) { label_covar = weight_covars[j].second.v2; } else if (weight_covars[j].first == incorrect_label) { incorrect_label_covar = weight_covars[j].second.v2; } } var += (label_covar + incorrect_label_covar) * val * val; } return margin; }
void passive_aggressive_2::train(const common::sfv_t& sfv, const string& label) { check_touchable(label); labels_.get_model()->increment(label); string incorrect_label; float margin = calc_margin(sfv, label, incorrect_label); float loss = 1.f + margin; if (loss < 0.f) { storage_->register_label(label); return; } float sfv_norm = squared_norm(sfv); if (sfv_norm == 0.f) { storage_->register_label(label); return; } update_weight( sfv, loss / (2 * sfv_norm + 1 / (2 * config_.regularization_weight)), label, incorrect_label); touch(label); }
void PA::train(const sfv_t& sfv, const string& label){ string incorrect_label; float margin = calc_margin(sfv, label, incorrect_label); float loss = 1.f + margin; if (loss < 0.f){ return; } float sfv_norm = squared_norm(sfv); if (sfv_norm == 0.f) { return; } update_weight(sfv, loss / sfv_norm, label, incorrect_label); }
void passive_aggressive_2::train(const common::sfv_t& sfv, const string& label) { string incorrect_label; float margin = calc_margin(sfv, label, incorrect_label); float loss = 1.f + margin; if (loss < 0.f) { return; } float sfv_norm = squared_norm(sfv); if (sfv_norm == 0.f) { return; } update_weight( sfv, loss / (2 * sfv_norm + 1 / (2 * config_.C)), label, incorrect_label); }
void passive_aggressive_1::train(const common::sfv_t& sfv, const string& label) { string incorrect_label; float margin = calc_margin(sfv, label, incorrect_label); float loss = 1.f + margin; if (loss < 0.f) { storage_->register_label(label); return; } float sfv_norm = squared_norm(sfv); if (sfv_norm == 0.f) { storage_->register_label(label); return; } update_weight( sfv, min(config_.C, loss / (2 * sfv_norm)), label, incorrect_label); touch(label); }