37 #ifndef SHARK_DATA_DATADISTRIBUTION_H 38 #define SHARK_DATA_DATADISTRIBUTION_H 56 template <
class InputType>
80 std::size_t batches = (size + maximumBatchSize - 1) / maximumBatchSize;
81 std::size_t optimalBatchSize = size / batches;
82 std::size_t remainder = size - batches * optimalBatchSize;
87 for (std::size_t i=0; i<batches; ++i)
89 std::size_t batchsize = (i<remainder) ? optimalBatchSize + 1 : optimalBatchSize;
93 for (std::size_t j=0; j<batchsize; j++)
95 if (j != 0)
draw(input);
119 template <
class InputType,
class LabelType>
129 virtual void draw(
InputType& input, LabelType& label)
const = 0;
133 std::pair<InputType,LabelType> ret;
134 draw(ret.first,ret.second);
145 std::size_t batches = (size + maximumBatchSize - 1) / maximumBatchSize;
146 std::size_t optimalBatchSize = size / batches;
147 std::size_t remainder = size - batches * optimalBatchSize;
151 DataPair<InputType, LabelType> pair(input, label);
154 for (std::size_t i=0; i<batches; ++i)
156 std::size_t batchsize = (i<remainder) ? optimalBatchSize + 1 : optimalBatchSize;
158 draw(input, label); pair.input = input; pair.label = label;
160 for (std::size_t j=0; j<batchsize; j++)
162 if (j != 0)
draw(input, label);
188 m_noiselevel = noiselevel;
192 void draw(RealVector& input,
unsigned int& label)
const{
194 unsigned int j, t = 0;
195 for (j = 0; j < 2; j++)
197 double v =
Rng::uni(0.0, (
double)m_size);
202 if (
Rng::uni(0.0, 1.0) < m_noiselevel) label = 1 - label;
217 Wave(
double stddev = 0.1,
double range = 5.0){
223 void draw(RealVector& input, RealVector& label)
const{
226 input(0) =
Rng::uni(-m_range, m_range);
228 label(0) = sin(input(0)) / input(0) +
Rng::gauss(0.0, m_stddev);
248 PamiToy(
unsigned int size_useful = 5,
unsigned int size_noise = 5,
double noise_position = 0.0,
double noise_variance = 1.0 )
249 : m_size( size_useful+size_noise ),
250 m_sizeUseful( size_useful ),
251 m_sizeNoise( size_noise ),
252 m_noisePos( noise_position) ,
253 m_noiseVar( noise_variance )
256 void draw(RealVector& input,
unsigned int& label)
const{
257 input.resize( m_size );
259 double y2 = label - 0.5;
261 for (
unsigned int i=0; i<m_sizeUseful; i++ ) {
262 input(i) = y2 +
Rng::gauss( m_noisePos, m_noiseVar );
265 for (
unsigned int i=m_sizeUseful; i<m_size; i++ ) {
266 input(i) =
Rng::gauss( m_noisePos, m_noiseVar );
284 CircleInSquare(
unsigned int dimensions = 2,
double noiselevel = 0.0,
bool class_prob_equal =
false )
285 : m_dimensions( dimensions ),
286 m_noiselevel( noiselevel ),
290 m_inner_radius2( 0.5*0.5 ),
291 m_outer_radius2( 0.5*0.5 ),
292 m_equal_class_prob( class_prob_equal )
296 void setLimits(
double lower_limit,
double upper_limit,
double inner_radius,
double outer_radius )
300 RANGE_CHECK( 2*outer_radius <= upper_limit-lower_limit );
301 m_lowerLimit = lower_limit;
302 m_upperLimit = upper_limit;
303 m_centerpoint = (upper_limit-lower_limit)/2.0;
304 m_inner_radius2 = inner_radius*inner_radius;
305 m_outer_radius2 = outer_radius*outer_radius;
308 void draw(RealVector& input,
unsigned int& label)
const 310 input.resize( m_dimensions );
313 if ( m_equal_class_prob ) {
315 label = ( this_label ? 1 : 0 );
316 if (
Rng::uni(0.0, 1.0) < m_noiselevel )
321 for (
unsigned int i=0; i<m_dimensions; i++ ) {
322 v =
Rng::uni( m_lowerLimit, m_upperLimit );
324 dist += (v-m_centerpoint)*(v-m_centerpoint);
326 }
while( dist > m_inner_radius2 );
331 for (
unsigned int i=0; i<m_dimensions; i++ ) {
332 v =
Rng::uni( m_lowerLimit, m_upperLimit );
334 dist += (v-m_centerpoint)*(v-m_centerpoint);
336 }
while( dist < m_outer_radius2 );
342 for (
unsigned int i=0; i<m_dimensions; i++ ) {
343 v =
Rng::uni( m_lowerLimit, m_upperLimit );
345 dist += (v-m_centerpoint)*(v-m_centerpoint);
347 label = ( dist < m_inner_radius2 ? 1 : 0 );
348 if (
Rng::uni(0.0, 1.0) < m_noiselevel )
350 }
while( dist > m_inner_radius2 && dist < m_outer_radius2 );
374 : m_radius2( radius*radius ),
375 m_noiselevel(
noise )
378 void draw(RealVector& input,
unsigned int& label)
const 390 if ( (3-x)*(3-x) + (1-y)*(1-y) < m_radius2 )
394 if (
Rng::uni(0.0, 1.0) < m_noiselevel )
414 m_dist.setCovarianceMatrix(covariance);
417 :m_dist(covariance), m_offset(offset){
418 SIZE_CHECK(offset.size() == covariance.size1());
420 void draw(RealVector& input)
const{
421 input.resize(m_offset.size());
423 noalias(input) += m_dist(Rng::globalRng).first;
435 std::size_t imageWidth, std::size_t imageHeight,
436 std::size_t patchWidth, std::size_t patchHeight
438 , m_imageWidth(imageWidth)
439 , m_imageHeight(imageHeight)
440 , m_patchWidth(patchWidth)
441 , m_patchHeight(patchHeight)
442 ,m_numImages(m_images.numberOfElements()){}
444 void draw(RealVector& input)
const{
449 std::size_t m_startX =
Rng::discrete(0,m_imageWidth-m_patchWidth);
450 std::size_t m_startY =
Rng::discrete(0,m_imageHeight-m_patchHeight);
454 input.resize(m_patchWidth * m_patchHeight);
455 std::size_t rowStart = m_startY * m_imageWidth + m_startX;
456 for (
size_t y = 0; y < m_patchHeight; ++y){
457 for (
size_t x = 0; x < m_patchWidth; ++x){
458 input(y * m_patchWidth + x) = image(rowStart+x);
460 rowStart += m_imageWidth;
465 std::size_t m_imageWidth;
466 std::size_t m_imageHeight;
467 std::size_t m_patchWidth;
468 std::size_t m_patchHeight;
469 std::size_t m_numImages;