Skip to content

Commit

Permalink
Fix ECOC Random coding bug.
Browse files Browse the repository at this point in the history
  • Loading branch information
pluskid committed May 6, 2012
1 parent 786359f commit 485f94a
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 8 deletions.
Expand Up @@ -4,6 +4,7 @@
#include <shogun/features/StreamingSimpleFeatures.h>
#include <shogun/features/SimpleFeatures.h>
#include <shogun/multiclass/ecoc/ECOCStrategy.h>
#include <shogun/multiclass/ecoc/ECOCRandomDenseEncoder.h>
#include <shogun/multiclass/ecoc/ECOCRandomSparseEncoder.h>
#include <shogun/multiclass/ecoc/ECOCHDDecoder.h>
#include <shogun/machine/LinearMulticlassMachine.h>
Expand Down Expand Up @@ -83,7 +84,7 @@ int main(int argc, char** argv)

// Create a multiclass svm classifier that consists of several of the previous one
CLinearMulticlassMachine* mc_svm = new CLinearMulticlassMachine(
new CECOCStrategy(new CECOCRandomSparseEncoder(), new CECOCHDDecoder()), (CDotFeatures*) features, svm, labels);
new CECOCStrategy(new CECOCRandomDenseEncoder(), new CECOCHDDecoder()), (CDotFeatures*) features, svm, labels);
SG_REF(mc_svm);

// Train the multiclass machine using the data passed in the constructor
Expand Down
11 changes: 11 additions & 0 deletions src/shogun/lib/SGMatrix.h
Expand Up @@ -40,6 +40,17 @@ template<class T> class SGMatrix
: matrix(orig.matrix), num_rows(orig.num_rows),
num_cols(orig.num_cols), do_free(orig.do_free) { }

/** operator= */
SGMatrix<T> &operator=(const SGMatrix<T> &rhs)
{
free_matrix();
matrix = rhs.matrix;
num_rows = rhs.num_rows;
num_cols = rhs.num_cols;
do_free = rhs.do_free;
return *this;
}

/** empty destructor */
virtual ~SGMatrix()
{
Expand Down
11 changes: 7 additions & 4 deletions src/shogun/multiclass/ecoc/ECOCRandomSparseEncoder.cpp
Expand Up @@ -51,6 +51,7 @@ SGMatrix<int32_t> CECOCRandomSparseEncoder::create_codebook(int32_t num_classes)
if (codelen <= 0)
codelen = get_default_code_length(num_classes);


SGMatrix<int32_t> best_codebook(codelen, num_classes, true);
int32_t best_dist = 0;

Expand Down Expand Up @@ -111,16 +112,18 @@ SGMatrix<int32_t> CECOCRandomSparseEncoder::create_codebook(int32_t num_classes)
if (min_dist > best_dist)
{
best_dist = min_dist;
std::copy(best_codebook.matrix, best_codebook.matrix + codelen*num_classes,
codebook.matrix);
std::copy(codebook.matrix, codebook.matrix + codelen*num_classes,
best_codebook.matrix);
}
}

n_iter++;
if (best_dist > 0 && n_iter >= m_maxiter)
if (++n_iter >= m_maxiter)
break;
}

if (best_dist <= 0)
SG_ERROR("Failed to generate ECOC codebook within max number of iterations (%d)", m_maxiter);

codebook.destroy_matrix();
return best_codebook;
}
5 changes: 2 additions & 3 deletions src/shogun/multiclass/ecoc/ECOCStrategy.cpp
Expand Up @@ -44,13 +44,12 @@ void CECOCStrategy::train_start(CLabels *orig_labels, CLabels *train_labels)
{
CMulticlassStrategy::train_start(orig_labels, train_labels);

m_codebook.free_matrix();
m_codebook = m_encoder->create_codebook(m_num_classes);
}

bool CECOCStrategy::train_has_more()
{
return m_train_iter < m_codebook.num_cols;
return m_train_iter < m_codebook.num_rows;
}

SGVector<int32_t> CECOCStrategy::train_prepare_next()
Expand All @@ -60,7 +59,7 @@ SGVector<int32_t> CECOCStrategy::train_prepare_next()
for (int32_t i=0; i < m_orig_labels->get_num_labels(); ++i)
{
int32_t label = m_orig_labels->get_int_label(i);
switch (m_codebook(label, m_train_iter))
switch (m_codebook(m_train_iter, label))
{
case -1:
m_train_labels->set_label(i, -1);
Expand Down

0 comments on commit 485f94a

Please sign in to comment.