341 if(verbose>0) {printf(
"fcmclustering()\n"); fflush(stdout);}
342 if(fcmc==NULL)
return(1);
355 double newJ=999999999.;
356 double minJ=9999999999999999.;
369 iter++;
if(verbose>1) {printf(
"iteration %d\n", iter); fflush(stdout);}
372 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
373 for(
unsigned int di=0; di<fcmc->
dimNr; di++) {
374 vnum[ci][di]=vden[ci][di]=0.0;
378 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
379 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
380 if(iter==1) oldU[si][ci]=0.0;
else oldU[si][ci]=currU[si][ci];
384 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
386 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
391 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
395 currU[si][ci] = 1.0/(d[si][ci]/dk[si]);
396 currU[si][ci]=pow(currU[si][ci], (2.0/(
double)(fcmc->
fc-1)) );
401 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
403 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
404 sumU[si]+=currU[si][ci];
408 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
409 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
410 currU[si][ci]=currU[si][ci]/sumU[si];
414 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
415 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
416 for(
unsigned int di=0; di<fcmc->
dimNr; di++) {
417 vnum[ci][di] += pow( currU[si][ci], fcmc->
fc ) * fcmc->
d[si][di];
418 vden[ci][di] += pow( currU[si][ci], fcmc->
fc );
423 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
424 for(
unsigned int di=0; di<fcmc->
dimNr; di++) {
425 fcmc->
cc[ci][di] = vnum[ci][di]/vden[ci][di];
432 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
433 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
434 newJ += pow(currU[si][ci], fcmc->
fc) * pow(d[si][ci], 2.0);
438 printf(
" objective_func_val %g -> %g\n", oldJ, newJ);
443 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
444 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
445 minU[si][ci]=currU[si][ci];
448 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
449 for(
unsigned int di=0; di<fcmc->
dimNr; di++) {
450 ccMin[ci][di]=fcmc->
cc[ci][di];
456 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
457 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
458 double v=fabs(currU[si][ci]-oldU[si][ci]);
459 if(v>maxUDiff) maxUDiff=v;
463 printf(
" max_diff_betw_prev_and_curr_membership_degree := %g\n", maxUDiff);
469 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
470 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
471 currU[si][ci]=minU[si][ci];
475 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
476 for(
unsigned int di=0; di<fcmc->
dimNr; di++) {
477 fcmc->
cc[ci][di]=ccMin[ci][di];
482 for(
unsigned int si=0; si<fcmc->
sampleNr; si++) {
484 for(
unsigned int ci=0; ci<fcmc->
clusterNr; ci++) {
485 if(currU[si][ci]>maxU) {