((b - a) * (std::rand() % 100) / 100.f) + a;
66 conststd::vector<std::valarray<double>> &X) {
67 size_tnum_points = X.size();
68 size_tnum_features = X[0].size();
74std::cerr <<
"Error opening file "<< fname <<
": " 75<< std::strerror(errno) <<
"\n";
80 for(
inti = 0; i < num_points; i++) {
82 for(
intj = 0; j < num_features; j++) {
84 if(j < num_features - 1) {
88 if(i < num_points - 1) {
105void get_min_2d(
conststd::vector<std::valarray<double>> &X,
double*val,
106 int*x_idx,
int*y_idx) {
110 for(
inti = 0; i < N; i++) {
111 autoresult = std::min_element(std::begin(X[i]), std::end(X[i]));
112 doubled_min = *result;
113std::ptrdiff_t j = std::distance(std::begin(X[i]), result);
115 if(d_min < val[0]) {
143 conststd::vector<std::vector<std::valarray<double>>> &W) {
144std::ofstream fp(fname);
146std::cerr <<
"File error ("<< fname <<
"): "<< std::strerror(errno)
154 for(
inti = 0; i < W.size(); i++) {
155 for(
intj = 0; j < W[0].size(); j++) {
156 doubledistance = 0.f;
158 intfrom_x = std::max<int>(0, i - R);
159 intto_x = std::min<int>(W.size(), i + R + 1);
160 intfrom_y = std::max<int>(0, j - R);
161 intto_y = std::min<int>(W[0].size(), j + R + 1);
164#pragma omp parallel for reduction(+ : distance) 166 for(l = from_x; l < to_x; l++) {
167 for(m = from_y; m < to_y; m++) {
168 autod = W[i][j] - W[l][m];
169 doubled2 = std::pow(d, 2).sum();
170distance += std::sqrt(d2);
177 if(j < W[0].size() - 1) {
181 if(i < W.size() - 1) {
201std::vector<std::vector<std::valarray<double>>> *W,
202std::vector<std::valarray<double>> *D,
doublealpha,
205 intnum_out_x =
static_cast<int>(W->size());
206 intnum_out_y =
static_cast<int>(W[0][0].size());
215 for(x = 0; x < num_out_x; x++) {
216 for(y = 0; y < num_out_y; y++) {
220 autod = ((*W)[x][y] - X);
221(*D)[x][y] = (d * d).
sum();
222(*D)[x][y] = std::sqrt((*D)[x][y]);
228 intd_min_x = 0, d_min_y = 0;
232 intfrom_x = std::max(0, d_min_x - R);
233 intto_x = std::min(num_out_x, d_min_x + R + 1);
234 intfrom_y = std::max(0, d_min_y - R);
235 intto_y = std::min(num_out_y, d_min_y + R + 1);
242 for(x = from_x; x < to_x; x++) {
243 for(y = from_y; y < to_y; y++) {
252(d_min_x - x) * (d_min_x - x) + (d_min_y - y) * (d_min_y - y);
253 doublescale_factor = std::exp(-d2 / (2.f * alpha * alpha));
255(*W)[x][y] += (X - (*W)[x][y]) * alpha * scale_factor;
270std::vector<std::vector<std::valarray<double>>> *W,
272 size_tnum_samples = X.size();
274 size_tnum_out = W->size();
275 size_tR = num_out >> 2, iter = 0;
278std::vector<std::valarray<double>> D(num_out);
279 for(
inti = 0; i < num_out; i++) D[i] = std::valarray<double>(num_out);
282 doublepast_dmin = 1.f;
283 doubledmin_ratio = 1.f;
286 for(; alpha > 0 && dmin_ratio > 1e-5; alpha -= 1e-4, iter++) {
288 for(
intsample = 0; sample < num_samples; sample++) {
294 if(iter % 300 == 0 && R > 1) {
301dmin_ratio = (past_dmin - dmin) / past_dmin;
302 if(dmin_ratio < 0) {
307std::cout <<
"iter: "<< iter <<
"\t alpha: "<< alpha <<
"\t R: "<< R
308<<
"\t d_min: "<< dmin_ratio <<
"\r";
331 const intN =
data->size();
332 const doubleR = 0.3;
334 const intnum_classes = 4;
335std::array<std::array<double, 2>, num_classes> centres = {
337std::array<double, 2>({.5, .5}),
338std::array<double, 2>({.5, -.5}),
339std::array<double, 2>({-.5, .5}),
340std::array<double, 2>({-.5, -.5})
346 for(i = 0; i < N; i++) {
348 intcls = std::rand() % num_classes;
351 data[0][i][0] =
_random(centres[cls][0] - R, centres[cls][0] + R);
352 data[0][i][1] =
_random(centres[cls][1] - R, centres[cls][1] + R);
373std::vector<std::valarray<double>> X(N);
374std::vector<std::vector<std::valarray<double>>> W(num_out);
375 for(
inti = 0; i < std::max(num_out, N); i++) {
378X[i] = std::valarray<double>(features);
381W[i] = std::vector<std::valarray<double>>(num_out);
382 for(
intk = 0; k < num_out; k++) {
383W[i][k] = std::valarray<double>(features);
387 for(j = 0; j < features; j++) {
389W[i][k][j] =
_random(-10, 10);
412 const size_tN =
data->size();
413 const doubleR = 0.3;
415 const intnum_classes = 4;
416 conststd::array<std::array<double, 3>, num_classes> centres = {
418std::array<double, 3>({.5, .5, .5}),
419std::array<double, 3>({.5, -.5, -.5}),
420std::array<double, 3>({-.5, .5, .5}),
421std::array<double, 3>({-.5, -.5 - .5})
427 for(i = 0; i < N; i++) {
429 intcls = std::rand() % num_classes;
432 data[0][i][0] =
_random(centres[cls][0] - R, centres[cls][0] + R);
433 data[0][i][1] =
_random(centres[cls][1] - R, centres[cls][1] + R);
434 data[0][i][2] =
_random(centres[cls][2] - R, centres[cls][2] + R);
455std::vector<std::valarray<double>> X(N);
456std::vector<std::vector<std::valarray<double>>> W(num_out);
457 for(
inti = 0; i < std::max(num_out, N); i++) {
460X[i] = std::valarray<double>(features);
463W[i] = std::vector<std::valarray<double>>(num_out);
464 for(
intk = 0; k < num_out; k++) {
465W[i][k] = std::valarray<double>(features);
469 for(j = 0; j < features; j++) {
471W[i][k][j] =
_random(-10, 10);
494 const size_tN =
data->size();
495 const doubleR = 0.2;
497 const intnum_classes = 8;
498 conststd::array<std::array<double, 3>, num_classes> centres = {
500std::array<double, 3>({.5, .5, .5}),
501std::array<double, 3>({.5, .5, -.5}),
502std::array<double, 3>({.5, -.5, .5}),
503std::array<double, 3>({.5, -.5, -.5}),
504std::array<double, 3>({-.5, .5, .5}),
505std::array<double, 3>({-.5, .5, -.5}),
506std::array<double, 3>({-.5, -.5, .5}),
507std::array<double, 3>({-.5, -.5, -.5})
513 for(i = 0; i < N; i++) {
515 intcls = std::rand() % num_classes;
518 data[0][i][0] =
_random(centres[cls][0] - R, centres[cls][0] + R);
519 data[0][i][1] =
_random(centres[cls][1] - R, centres[cls][1] + R);
520 data[0][i][2] =
_random(centres[cls][2] - R, centres[cls][2] + R);
541std::vector<std::valarray<double>> X(N);
542std::vector<std::vector<std::valarray<double>>> W(num_out);
543 for(
inti = 0; i < std::max(num_out, N); i++) {
546X[i] = std::valarray<double>(features);
549W[i] = std::vector<std::valarray<double>>(num_out);
550 for(
intk = 0; k < num_out; k++) {
551W[i][k] = std::valarray<double>(features);
555 for(j = 0; j < features; j++) {
557W[i][k][j] =
_random(-10, 10);
578 return static_cast<double>(end_t - start_t) / CLOCKS_PER_SEC;
584std::cout <<
"Using OpenMP based parallelization\n";
586std::cout <<
"NOT using OpenMP based parallelization\n";
589std::srand(std::time(
nullptr));
591std::clock_t start_clk = std::clock();
593 autoend_clk = std::clock();
594std::cout <<
"Test 1 completed in "<<
get_clock_diff(start_clk, end_clk)
597start_clk = std::clock();
599end_clk = std::clock();
600std::cout <<
"Test 2 completed in "<<
get_clock_diff(start_clk, end_clk)
603start_clk = std::clock();
605end_clk = std::clock();
606std::cout <<
"Test 3 completed in "<<
get_clock_diff(start_clk, end_clk)
610<<
"(Note: Calculated times include: creating test sets, training " 611 "model and writing files to disk.)\n\n";
void get_min_2d(const std::vector< std::valarray< double > > &X, double *val, int *x_idx, int *y_idx)
int save_2d_data(const char *fname, const std::vector< std::valarray< double > > &X)
double _random(double a, double b)
void test_3d_classes1(std::vector< std::valarray< double > > *data)
double get_clock_diff(clock_t start_t, clock_t end_t)
void test_2d_classes(std::vector< std::valarray< double > > *data)
void test_3d_classes2(std::vector< std::valarray< double > > *data)
int save_u_matrix(const char *fname, const std::vector< std::vector< std::valarray< double > > > &W)
void kohonen_som(const std::vector< std::valarray< double > > &X, std::vector< std::vector< std::valarray< double > > > *W, double alpha_min)
T sum(const std::vector< std::valarray< T > > &A)
constexpr double MIN_DISTANCE
int save_u_matrix(const char *fname, const std::vector< std::vector< std::valarray< double > > > &W)
void kohonen_som(const std::vector< std::valarray< double > > &X, std::vector< std::vector< std::valarray< double > > > *W, double alpha_min)
double update_weights(const std::valarray< double > &X, std::vector< std::vector< std::valarray< double > > > *W, std::vector< std::valarray< double > > *D, double alpha, int R)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4