Skip to content

Commit

Permalink
Add Gaussian generator in DataGenerator
Browse files Browse the repository at this point in the history
and add unit test based on DataGenerator for SVMOcas
  • Loading branch information
vigsterkr committed Aug 10, 2012
1 parent 529eea9 commit bebc04e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 9 deletions.
29 changes: 29 additions & 0 deletions src/shogun/features/DataGenerator.cpp
Expand Up @@ -9,6 +9,7 @@

#include <shogun/features/DataGenerator.h>
#include <shogun/mathematics/Math.h>
#include <shogun/distributions/Gaussian.h>

using namespace shogun;

Expand Down Expand Up @@ -76,3 +77,31 @@ SGMatrix<float64_t> CDataGenerator::generate_sym_mix_gauss(index_t m,

return result;
}

SGMatrix<float64_t> CDataGenerator::generate_gaussians(index_t m, index_t n, index_t dim)
{
/* evtl. allocate space */
SGMatrix<float64_t> result =
SGMatrix<float64_t>::get_allocated_matrix(dim, n*m);


for (index_t i = 0; i < n; ++i)
{
SGVector<float64_t> mean(dim);
SGMatrix<float64_t> cov = SGMatrix<float64_t>::create_identity_matrix(dim, 1.0);

mean.random(0.0, 10.0);

CGaussian* g = new CGaussian(mean, cov, DIAG);
for (index_t j = 0; j < m; ++j)
{
SGVector<float64_t> v = g->sample();
memcpy(result.matrix+((i+j)*result.num_rows), v.vector, dim*sizeof(float64_t));
}

SG_UNREF(g);
}

return result;
}

8 changes: 8 additions & 0 deletions src/shogun/features/DataGenerator.h
Expand Up @@ -68,6 +68,14 @@ class CDataGenerator: public CSGObject
float64_t d, float64_t angle,
SGMatrix<float64_t> target=SGMatrix<float64_t>());

/*
*
* @param m number of samples
* @param n number of gaussians
* @
*/
static SGMatrix<float64_t> generate_gaussians(index_t m, index_t n, index_t dim);

inline virtual const char* get_name() const { return "DataGenerator"; }

private:
Expand Down
18 changes: 9 additions & 9 deletions tests/unit/classifier/svm/SVMOcas_unittest.cc
Expand Up @@ -10,23 +10,23 @@ using namespace shogun;

TEST(SVMOcasTest,train)
{
index_t num_samples = 100, dim = 10;
float64_t mean_shift = 1.0;
index_t num_samples = 50;
float64_t dist = 1.0, angle = 0.0;
CMath::init_random(5);
SGMatrix<float64_t> data =
CDataGenerator::generate_mean_data(num_samples, dim, mean_shift);
CDataGenerator::generate_gaussians(num_samples, 2, 2);
CDenseFeatures<float64_t> features(data);

SGVector<index_t> train_idx(100), test_idx(100);
SGVector<float64_t> labels(100);
SGVector<index_t> train_idx(num_samples), test_idx(num_samples);
SGVector<float64_t> labels(num_samples);
for (index_t i = 0, j = 0; i < data.num_cols; ++i)
{
if (i % 2 == 0)
train_idx[j] = i;
else
test_idx[j++] = i;

labels[i/2] = (i < 100) ? 1.0 : -1.0;
labels[i/2] = (i < data.num_cols/2) ? 1.0 : -1.0;
}

CDenseFeatures<float64_t>* train_feats = (CDenseFeatures<float64_t>*)features.copy_subset(train_idx);
Expand All @@ -38,12 +38,12 @@ TEST(SVMOcasTest,train)
ocas->train();

CLabels* pred = ocas->apply(test_feats);
CROCEvaluation roc;
float64_t err = CMath::abs(roc.evaluate(pred, ground_truth)-0.7684);
EXPECT_TRUE(err < 10E-12);
for (int i = 0; i < num_samples; ++i)
EXPECT_EQ(((CBinaryLabels*)pred)->get_int_label(i), ((CBinaryLabels)labels).get_int_label(i));

SG_UNREF(ocas);
SG_UNREF(train_feats);
SG_UNREF(test_feats);
SG_UNREF(pred);
}

0 comments on commit bebc04e

Please sign in to comment.