21 CECOCDiscriminantEncoder::CECOCDiscriminantEncoder()
26 CECOCDiscriminantEncoder::~CECOCDiscriminantEncoder()
32 void CECOCDiscriminantEncoder::init()
51 m_features = features;
54 void CECOCDiscriminantEncoder::set_labels(
CLabels *labels)
63 if (!m_features || !m_labels)
64 SG_ERROR(
"Need features and labels to learn the codebook")
66 m_feats = m_features->get_feature_matrix();
71 for (int32_t itree = 0; itree < m_num_trees; ++itree)
73 vector<int32_t> classes(num_classes);
74 for (int32_t i=0; i < num_classes; ++i)
77 binary_partition(classes);
84 void CECOCDiscriminantEncoder::binary_partition(
const vector<int32_t>& classes)
86 if (classes.size() > 2)
88 int32_t isplit = classes.
size()/2;
89 vector<int32_t> part1(classes.begin(), classes.begin()+isplit);
90 vector<int32_t> part2(classes.begin()+isplit, classes.end());
91 run_sffs(part1, part2);
92 for (
size_t i=0; i < part1.size(); ++i)
93 m_codebook(m_code_idx, part1[i]) = +1;
94 for (
size_t i=0; i < part2.size(); ++i)
95 m_codebook(m_code_idx, part2[i]) = -1;
99 binary_partition(part1);
100 if (part2.size() > 1)
101 binary_partition(part2);
105 m_codebook(m_code_idx, classes[0]) = +1;
106 m_codebook(m_code_idx, classes[1]) = -1;
111 void CECOCDiscriminantEncoder::run_sffs(vector<int32_t>& part1, vector<int32_t>& part2)
113 std::set<int32_t> idata1;
114 std::set<int32_t> idata2;
116 for (int32_t i=0; i < m_labels->get_num_labels(); ++i)
118 if (find(part1.begin(), part1.end(), ((
CMulticlassLabels*) m_labels)->get_int_label(i)) != part1.end())
120 else if (find(part2.begin(), part2.end(), ((
CMulticlassLabels*) m_labels)->get_int_label(i)) != part2.end())
124 float64_t MI = compute_MI(idata1, idata2);
125 for (int32_t i=0; i < m_iterations; ++i)
128 MI = sffs_iteration(MI, part1, idata1, part2, idata2);
130 MI = sffs_iteration(MI, part2, idata2, part1, idata1);
134 float64_t CECOCDiscriminantEncoder::sffs_iteration(
float64_t MI, vector<int32_t>& part1, std::set<int32_t>& idata1,
135 vector<int32_t>& part2, std::set<int32_t>& idata2)
137 if (part1.size() <= 1)
140 int32_t iclas = CMath::random(0, int32_t(part1.size()-1));
141 int32_t clas = part1[iclas];
144 for (int32_t i=0; i < m_labels->get_num_labels(); ++i)
153 float64_t new_MI = compute_MI(idata1, idata2);
156 part2.push_back(clas);
157 part1.erase(part1.begin() + iclas);
163 for (int32_t i=0; i < m_labels->get_num_labels(); ++i)
176 float64_t CECOCDiscriminantEncoder::compute_MI(
const std::set<int32_t>& idata1,
const std::set<int32_t>& idata2)
183 for (int32_t i=0; i < m_feats.num_rows; ++i)
187 for (int32_t j=1; j < m_feats.num_cols; ++j)
189 max_val =
max(max_val, m_feats(i, j));
190 min_val = min(min_val, m_feats(i, j));
193 if (max_val - min_val < 1e-10)
194 max_val = min_val + 1;
196 compute_hist(i, max_val, min_val, idata1, hist1);
197 compute_hist(i, max_val, min_val, idata2, hist2);
200 for (
int j=0; j < 10; ++j)
201 MI_i += (hist1[j]-hist2[j])*(hist1[j]-hist2[j]);
202 MI += CMath::sqrt(MI_i);
208 void CECOCDiscriminantEncoder::compute_hist(int32_t i,
float64_t max_val,
float64_t min_val,
209 const std::set<int32_t>& idata, int32_t *hist)
212 fill(hist, hist+10, 0);
214 for (std::set<int32_t>::const_iterator it = idata.begin(); it != idata.end(); ++it)
216 float64_t val = (m_feats(i, *it) - min_val) / (max_val - min_val);
217 int32_t pos = min(9, static_cast<int32_t>(val*10));
The class Labels models labels, i.e. class assignments of objects.
Multiclass Labels for multi-class classification.
all of classes and functions are contained in the shogun namespace
Matrix::Scalar max(Matrix m)