⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfem-engine.c

📁 数据挖掘方面的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
   int i, j;   long n;   ExamplePtr centroid, newCentroid, cMin, cMax, e;   double denominator, numerator, delta, weight;   double *denomValues;   denomValues = MNewPtr(sizeof(double) * VALLength(is->centroids));   DebugWarn(VALLength(is->centroids) == 0,                  "newCentroid will be used uninitialized\n");   newCentroid = 0;   e = ExampleRead(boundData, es);   n = 1;   while(e != 0 && n <= is->n) {      if(gMessageLevel > 4) {         ExampleWrite(e, stdout);      }      /* HERE modify for negative Xs */      /* do the W-Plusses */      denominator = 0;      for(i = 0 ; i < VALLength(is->centroids) ; i++) {         centroid = VLIndex(is->centroids, i);         cMax = VLIndex(is->cMax, i);         cMin = VLIndex(is->cMin, i);         denomValues[i] = exp( (-1.0 / (2.0 * gSigmaSquare)) *           pow(AssignmentScaledDeltaMax(e, centroid, cMin, cMax,                             is->lastBound[i]), 2));         denominator += denomValues[i];      }      for(i = 0 ; i < VALLength(is->centroids) ; i++) {         centroid = VLIndex(is->centroids, i);         newCentroid = VALIndex(newCentroids, i);         cMax = VLIndex(is->cMax, i);         cMin = VLIndex(is->cMin, i);         numerator = exp( (-1.0 / (2.0 * gSigmaSquare)) *            pow(AssignmentScaledDeltaMin(e, centroid, cMin, cMax,                             is->lastBound[i]), 2));         denominator -= denomValues[i];         denominator += numerator;         weight = (numerator /denominator);         if(weight > 1.0) {            weight = 1.0;         }         //printf("c%d num: %.4f denom: %.4f w+: %.4f\n", i, numerator,         //        denominator, weight);         //printf("   ob delta: %.4f as deltamin: %.4f\n",         //        ExampleDistance(e, centroid),         //         AssignmentScaledDeltaMin(e, centroid, cMin, cMax));         is->wPlus[i] += weight;         is->wPlusSquare[i] += pow(weight, 2);         for(j = 0 ; j < ExampleSpecGetNumAttributes(es) ; j++) {            is->wxPlus[i][j] += weight *                         ExampleGetContinuousAttributeValue(e, j);             delta = ExampleGetContinuousAttributeValue(e, j) -                    ExampleGetContinuousAttributeValue(newCentroid, j);            if(delta > 0) {               is->deltaPlus[i][j] += weight * delta;            } else {               is->deltaMinus[i][j] += weight * delta;            }            if(gMessageLevel > 4) {               printf("w+ %.2f D %.2f D+ %.2f D- %.2f\n",                   weight, delta, is->deltaPlus[i][j], is->deltaMinus[i][j]);            }         }         denominator += denomValues[i];         denominator -= numerator;      }      /* HERE should denominator use min for the centroid in numerator? */      /* do the W-Minuses */      denominator = 0;      for(i = 0 ; i < VALLength(is->centroids) ; i++) {         centroid = VLIndex(is->centroids, i);         cMax = VLIndex(is->cMax, i);         cMin = VLIndex(is->cMin, i);         denomValues[i] = exp( (-1.0 / (2.0 * gSigmaSquare)) *            pow(AssignmentScaledDeltaMin(e, centroid, cMin, cMax,                           is->lastBound[i]), 2));         denominator += denomValues[i];      }       for(i = 0 ; i < VALLength(is->centroids) ; i++) {         centroid = VLIndex(is->centroids, i);         cMax = VLIndex(is->cMax, i);         cMin = VLIndex(is->cMin, i);         numerator = exp( (-1.0 / (2.0 * gSigmaSquare)) *            pow(AssignmentScaledDeltaMax(e, centroid, cMin, cMax,                           is->lastBound[i]), 2));         denominator -= denomValues[i];         denominator += numerator;         weight = (numerator /denominator);         //printf("c%d num: %.4f denom: %.4f w-: %.4f\n", i, numerator,         //          denominator, (numerator / denominator));         //printf("   ob delta: %.4f as deltamax: %.4f\n",         //          ExampleDistance(e, centroid),         //         AssignmentScaledDeltaMax(e, centroid, cMin, cMax));         is->wMinus[i] += weight;         for(j = 0 ; j < ExampleSpecGetNumAttributes(es) ; j++) {            is->wxMinus[i][j] += weight *                 ExampleGetContinuousAttributeValue(e, j);            delta = ExampleGetContinuousAttributeValue(e, j) -                    ExampleGetContinuousAttributeValue(newCentroid, j);            if(delta > 0) {               is->deltaMinus[i][j] += weight * delta;            } else {               is->deltaPlus[i][j] += weight * delta;            }            if(gMessageLevel > 4) {               printf("w- %.2f D %.2f D+ %.2f D- %.2f\n",                   weight, delta, is->deltaPlus[i][j], is->deltaMinus[i][j]);            }         }         denominator += denomValues[i];         denominator -= numerator;      }      ExampleFree(e);      e = ExampleRead(boundData, es);      n++;   }   if(e != 0) {      ExampleFree(e);   }   for(i = 0 ; i < VALLength(is->centroids) ; i++) {      for(j = 0 ; j < ExampleSpecGetNumAttributes(es) ; j++) {         is->deltaPlus[i][j] = fabs(is->deltaPlus[i][j]);         is->deltaMinus[i][j] = fabs(is->deltaMinus[i][j]);      }   }   MFreePtr(denomValues);}float IterationStatsErrorBoundDimension(IterationStatsPtr is, int cluster,					int dimension) {   return max(    fabs(     ExampleGetContinuousAttributeValue(VALIndex(is->cMax, cluster),                                                             dimension) -     ExampleGetContinuousAttributeValue(VALIndex(is->centroids, cluster),                                                dimension)),    fabs(     ExampleGetContinuousAttributeValue(VALIndex(is->cMin, cluster),                                                                dimension) -     ExampleGetContinuousAttributeValue(VALIndex(is->centroids, cluster),                                                        dimension)));}IterationStatsPtr IterationStatsNext(IterationStatsPtr is, float delta, float R, float assignErrorScale, ExampleSpecPtr es, int usePedroBound, FILE *boundData) {   IterationStatsPtr newIs;   int i, j;   float thisBound;   VoidAListPtr newCentroids = VALNew();   /* initialize the new stat structure with the correct centroids */   _MakeNewCentroids(is->centroids, newCentroids, (VoidAListPtr)0,         is->wx, is->w, is->wPlusSquare, is->wMinus, is->n, es,         gNeededDelta, 0, 0, 0, (double **) 0, (double **) 0);   newIs = IterationStatsInitial(newCentroids);   newIs->isFirstIteration = 0;   /* HERE MEM this leaks the memory of the newCentroids should example free */   VALFree(newCentroids);   if(usePedroBound) {      _RecordPedroBoundInfo(boundData, is, newIs->centroids, es);      if(gMessageLevel > 1) {	IterationStatsWrite(is, es, stdout);      }      /* now make the min and max centroids */      _MakeNewCentroids(is->centroids, newIs->cMax, newIs->cMaxAssignment,           is->wx, is->w, is->wPlusSquare, is->wMinus, is->n, es, gNeededDelta,                1, 1, !is->isFirstIteration, is->deltaPlus, is->deltaMinus);      _MakeNewCentroids(is->centroids, newIs->cMin, newIs->cMinAssignment,            is->wx, is->w, is->wPlusSquare, is->wMinus, is->n, es, gNeededDelta,                1, 0, !is->isFirstIteration, is->deltaPlus, is->deltaMinus);   } else {      /* now make the min and max centroids */      _MakeNewCentroids(is->centroids, newIs->cMax, newIs->cMaxAssignment,              is->wxPlus, is->wMinus,         is->wPlusSquare, is->wMinus, is->n, es, gNeededDelta, 1, 1, 0,                    (double **)0, (double **)0);      _MakeNewCentroids(is->centroids, newIs->cMin, newIs->cMinAssignment,               is->wxMinus, is->wPlus,         is->wPlusSquare, is->wMinus, is->n, es, gNeededDelta, 1, 0, 0,                    (double **)0, (double **)0);   }   newIs->foundBound = is->foundBound;   /* now fill in the bounds information */   for(i = 0 ; i < VALLength(is->centroids) ; i++) {      if(is->w[i] == 0 || is->wMinus[i] == 0 || is->wPlus[i] == 0) {         newIs->lastBound[i] = 1000000;         newIs->lastAssignmentBound[i] = 1000000;         newIs->foundBound = 0;         //printf("*** n^ == n+ can't find a bound for this run\n");         //exit(0);      } else {         newIs->lastBound[i] = max(             ExampleDistance(VALIndex(newIs->centroids, i),                                      VALIndex(newIs->cMax, i)),             ExampleDistance(VALIndex(newIs->centroids, i),                                      VALIndex(newIs->cMin, i)));         newIs->lastAssignmentBound[i] = max (             ExampleDistance(VALIndex(newIs->centroids, i),                                      VALIndex(newIs->cMaxAssignment, i)),             ExampleDistance(VALIndex(newIs->centroids, i),                                      VALIndex(newIs->cMinAssignment, i)));         for(j = 0 ; j < ExampleSpecGetNumAttributes(es) ; j++) {            /* Find the largest dimension bound so we know                 how many samples for next round if needed */            /* HERE discrete? */            thisBound = IterationStatsErrorBoundDimension(newIs, i, j);            if(newIs->maxEkd < thisBound) {               newIs->maxEkd = thisBound;            }         }      }   }   if(gMessageLevel > 2) {      printf("Made the next IS, centroids:\n");      for(i = 0 ; i < VALLength(newIs->centroids) ; i++) {         printf("lastBound %d: %.4f lastAssignmentBound: %.4f\n", i,                  newIs->lastBound[i], newIs->lastAssignmentBound[i]);         printf("nCMin   %d: ", i);         ExampleWrite(VALIndex(newIs->cMin, i), stdout);         printf("nCMinAs %d: ", i);         ExampleWrite(VALIndex(newIs->cMinAssignment, i), stdout);         printf("nC      %d: ", i);         ExampleWrite(VALIndex(newIs->centroids, i), stdout);         printf("nCMaxAs %d: ", i);         ExampleWrite(VALIndex(newIs->cMaxAssignment, i), stdout);         printf("nCMax   %d: ", i);         ExampleWrite(VALIndex(newIs->cMax, i), stdout);         fflush(stdout);      }   }   return newIs;}void IterationStatsWrite(IterationStatsPtr is, ExampleSpecPtr es, FILE *out) {   int i, j;   fprintf(out, "----------\n");   for(i = 0 ; i < VALLength(is->centroids) ; i++) {      fprintf(out, "center #%d lastBound: %.3lf lastAssignmentBound: %.3f\n",             i, is->lastBound[i], is->lastAssignmentBound[i]);      fprintf(out, "   ");      ExampleWrite(VALIndex(is->cMin, i), out);      fprintf(out, "   ");      ExampleWrite(VALIndex(is->centroids, i), out);      fprintf(out, "   ");      ExampleWrite(VALIndex(is->cMax, i), out);      fprintf(out, "   w- %.2lf w %.2lf w+ %.2lf w+^2 %.2lf\n", is->wMinus[i], is->w[i], is->wPlus[i], is->wPlusSquare[i]);      for(j = 0 ; j < ExampleSpecGetNumAttributes(es) ; j++) {         fprintf(out, "      d%d: wx- %.2lf wx %.2lf wx+ %.2lf delta+ %.2f delta- %.2f\n", j, is->wxMinus[i][j], is->wx[i][j], is->wxPlus[i][j], is->deltaPlus[i][j], is->deltaMinus[i][j]);      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -