Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <shogun/lib/config.h>
00011
00012 #include <shogun/features/DataGenerator.h>
00013 #include <shogun/mathematics/Math.h>
00014 #include <shogun/distributions/Gaussian.h>
00015
00016 using namespace shogun;
00017
00018 CDataGenerator::CDataGenerator() : CSGObject()
00019 {
00020 init();
00021 }
00022
00023 CDataGenerator::~CDataGenerator()
00024 {
00025
00026 }
00027
00028 void CDataGenerator::init()
00029 {
00030 }
00031
00032 SGMatrix<float64_t> CDataGenerator::generate_mean_data(index_t m,
00033 index_t dim, float64_t mean_shift,
00034 SGMatrix<float64_t> target)
00035 {
00036
00037 SGMatrix<float64_t> result=SGMatrix<float64_t>::get_allocated_matrix(
00038 dim, 2*m, target);
00039
00040
00041 for (index_t i=0; i<2*m; ++i)
00042 {
00043 for (index_t j=0; j<dim; ++j)
00044 result(j,i)=CMath::randn_double();
00045
00046
00047 if (i>=m)
00048 result(0,i)+=mean_shift;
00049 }
00050
00051 return result;
00052 }
00053
00054 SGMatrix<float64_t> CDataGenerator::generate_sym_mix_gauss(index_t m,
00055 float64_t d, float64_t angle, SGMatrix<float64_t> target)
00056 {
00057
00058 SGMatrix<float64_t> result=SGMatrix<float64_t>::get_allocated_matrix(
00059 2, m, target);
00060
00061
00062 SGMatrix<float64_t> rot=SGMatrix<float64_t>(2,2);
00063 rot(0, 0)=CMath::cos(angle);
00064 rot(0, 1)=-CMath::sin(angle);
00065 rot(1, 0)=CMath::sin(angle);
00066 rot(1, 1)=CMath::cos(angle);
00067
00068
00069
00070 for (index_t i=0; i<m; ++i)
00071 {
00072 result(0,i)=CMath::randn_double() + (CMath::random(0, 1) ? d : -d);
00073 result(1,i)=CMath::randn_double() + (CMath::random(0, 1) ? d : -d);
00074 }
00075
00076
00077 if (angle)
00078 result=SGMatrix<float64_t>::matrix_multiply(rot, result);
00079
00080 return result;
00081 }
00082 #ifdef HAVE_LAPACK
00083 SGMatrix<float64_t> CDataGenerator::generate_gaussians(index_t m, index_t n, index_t dim)
00084 {
00085
00086 SGMatrix<float64_t> result =
00087 SGMatrix<float64_t>::get_allocated_matrix(dim, n*m);
00088
00089 float64_t grid_distance = 5.0;
00090 for (index_t i = 0; i < n; ++i)
00091 {
00092 SGVector<float64_t> mean(dim);
00093 SGMatrix<float64_t> cov = SGMatrix<float64_t>::create_identity_matrix(dim, 1.0);
00094
00095 mean.zero();
00096 for (index_t k = 0; k < dim; ++k)
00097 {
00098 mean[k] = (i+1)*grid_distance;
00099 if (k % (i+1) == 0)
00100 mean[k] *= -1;
00101 }
00102 CGaussian* g = new CGaussian(mean, cov, DIAG);
00103 for (index_t j = 0; j < m; ++j)
00104 {
00105 SGVector<float64_t> v = g->sample();
00106 memcpy((result.matrix+j*result.num_rows+i*m*dim), v.vector, dim*sizeof(float64_t));
00107 }
00108
00109 SG_UNREF(g);
00110 }
00111
00112 return result;
00113 }
00114 #endif