37 #ifdef UNUSED // detected as unused 29.6.2018 43 void FuzzySOM::nSteps(
const unsigned long& _nSteps)
53 void FuzzySOM::initialFuzzyMembership(
const double& _m0)
64 void FuzzySOM::finalFuzzyMembership(
const double& _m1)
74 void FuzzySOM::setAnnSteps(
const unsigned long& _annSteps)
85 void FuzzySOM::regularization(
const double& _reg)
100 numNeurons = _som.
size();
101 numVectors = _examples.size();
102 dim = _examples.theItems[0].size();
103 tmpV.resize(dim, 0.);
104 tmpDens.resize(numNeurons, 0.);
105 tmpMap.resize(numNeurons);
106 for (
size_t i = 0;
i < numNeurons;
i++)
107 tmpMap[
i].resize(dim, 0.);
109 tmpD.resize(numNeurons);
120 for (
size_t i = 0;
i < _examples.size();
i++)
121 for (
size_t j = 0;
j < _som.
size();
j++)
126 if (verbosity == 1 || verbosity == 3)
133 fuzz = m0 -
iter * (m0 - m1) / (annSteps - 1);
134 stopError = updateU(_som, _examples, fuzz);
135 updateV(_som, _examples, fuzz);
136 if (verbosity == 1 || verbosity == 3)
141 sprintf(s,
"Iteration %d of %d. Code vectors variation: %g\n", (
int)(iter + 1), (
int)annSteps, stopError);
145 if (verbosity == 1 || verbosity == 3)
153 for (
size_t i = 0;
i < _examples.size();
i++)
154 for (
size_t j = 0;
j < _som.
size();
j++)
160 if (verbosity == 1 || verbosity == 3)
164 stopError = epsilon + 1;
166 while ((stopError > epsilon) && (t < somNSteps))
168 stopError = updateU(_som, _examples, m1);
169 updateV(_som, _examples, m1);
171 if (verbosity == 1 || verbosity == 3)
176 sprintf(s,
"Iteration %d of %d. Code vectors variation: %g\n", (
int)t, (
int)somNSteps, stopError);
180 if (verbosity == 1 || verbosity == 3)
212 for (
size_t i = 0;
i < _examples.size();
i++)
218 if ((
i % (
int)((_examples.size()*5) / 100)) == 0)
224 return (qerror / (
double) _examples.size());
233 double FuzzySOM::updateU(
FuzzyMap& _som,
const TS& _examples,
const double& _m)
246 auxExp = 1. / (_m - 1.);
249 for (k = 0; k < numVectors; k++)
252 for (i = 0; i < numNeurons; i ++)
255 for (j = 0; j < dim; j++)
256 auxDist += (
double)((double)(_examples.theItems[k][j]) - (double)(_som.
theItems[i][j])) * ((
double)(_examples.theItems[
k][
j]) - (
double)(_som.
theItems[
i][
j]));
257 auxDist = pow(auxDist, auxExp);
258 if (!finite(auxDist))
262 auxProd += (double) 1. / auxDist;
265 for (j = 0; j < numNeurons; j ++)
267 double tmp = 1. / (auxProd * tmpD[
j]);
268 var += fabs((
double)(_som.
memb[k][j]) - tmp);
275 var /= (double) numNeurons * numVectors;
286 void FuzzySOM::updateV(
FuzzyMap& _som,
const TS& _examples,
const double& _m)
294 for (cc = 0; cc < numNeurons; cc++)
296 for (j = 0; j < dim; j++)
299 for (vv = 0; vv < numVectors; vv++)
301 auto tmpU = (double) pow((
double)(_som.
memb[
vv][cc]), (
double)_m);
303 for (j = 0; j < dim; j++)
305 tmpMap[cc][
j] += (double)((
double) tmpU * (double)(_examples.theItems[vv][j]));
315 double stopError2 = 1;
316 while ((stopError2 > 1e-5) && (t2 < 100))
320 for (cc = 0; cc < numNeurons; cc++)
324 for (j = 0; j < dim; j++)
327 double tmpU = (tmpMap[cc][
j] + tmpV[
j]) / tmpDens[cc];
328 stopError2 += fabs((
double)(_som.
theItems[cc][j]) - tmpU);
332 stopError2 /= (double)(numNeurons * dim);
353 for (vv = 0; vv < numVectors; vv++)
355 for (cc = 0; cc < numNeurons; cc++)
358 for (
size_t j = 0; j < dim; j++)
359 t += ((
double)(_examples.theItems[vv][j]) - (
double)(_som.
theItems[cc][j])) * ((double)(_examples.theItems[vv][j]) - (double)(_som.
theItems[cc][j]));
360 t1 = (double) pow((
double)_som.
memb[
vv][cc], (double) _m);
370 for (cc = 0; cc < numNeurons; cc++)
373 for (j = 0; j < dim; j++)
378 _penalty /= (double)(numNeurons);
381 return (_fidelity - _reg*_penalty);
384 #ifdef UNUSED // detected as unused 29.6.2018 386 void FuzzySOM::showX(
const TS& _ts)
388 std::cout <<
"Data (1..nd, 1..nv) " << std::endl;
389 for (
size_t i = 0;
i < _ts.size();
i++)
391 for (
size_t j = 0;
j < _ts.theItems[0].size();
j++)
393 std::cout <<
i + 1 <<
" " <<
j + 1 <<
" " << _ts.theItems[
i][
j] << std::endl;
399 void FuzzySOM::showV(
FuzzyMap& _som)
401 std::cout <<
"Code vectors (1..ni, 1..nj, 1..nv) " << std::endl;
402 for (
size_t i = 0;
i < _som.
size();
i++)
406 for (
size_t j = 0;
j < _som.
theItems[0].size();
j++)
407 std::cout << tmpi + 1 <<
" " << tmpj + 1 <<
" " <<
j + 1 <<
" " << _som.
theItems[
i][
j] << std::endl;
412 void FuzzySOM::showU(
FuzzyMap& _som,
const TS& _ts)
414 std::cout <<
" Memberships (1..nd,1..ni,1..nj)" << std::endl;
415 for (
size_t i = 0;
i < _ts.size();
i++)
417 for (
size_t j = 0;
j < _som.
size();
j++)
421 std::cout <<
i + 1 <<
" " << tmpi + 1 <<
" " << tmpj + 1 <<
" " << _som.
memb[
i][
j] << std::endl;
double euclideanDistance(const std::vector< T > &_v1, const std::vector< T > &_v2)
MM memb
Alias for Fuzzy vectors.
void localAve(const SomPos &_center, std::vector< double > &_aveVector) const
SomPos indexToPos(const unsigned &_i) const
virtual void OnReportOperation(const std::string &_rsOp)=0
virtual void OnInitOperation(unsigned long _est_it)=0
virtual const unsigned & getVerbosity() const
virtual double test(const FuzzyMap &_som, const TS &_examples) const
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
if(fabs(c[*nmax+ *nmax *c_dim1])==0.e0)
std::vector< Item > theItems
virtual void OnProgress(unsigned long _it)=0
virtual FeatureVector & fuzzyTest(unsigned _in) const
virtual void train(FuzzyMap &_som, const TS &_examples)
virtual double functional(const TS &_examples, const FuzzyMap &_som, double _m, double _reg, double &_fidelity, double &_penalty)