📄 vfem-engine.c
字号:
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 + -