mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-12 15:46:54 +08:00
Added Davies-Bouldin index [skip ci]
This commit is contained in:
@@ -167,6 +167,8 @@ BuildCallback(Relation index, CALLBACK_ITEM_POINTER, Datum *values,
|
|||||||
|
|
||||||
#ifdef IVFFLAT_KMEANS_DEBUG
|
#ifdef IVFFLAT_KMEANS_DEBUG
|
||||||
buildstate->inertia += minDistance;
|
buildstate->inertia += minDistance;
|
||||||
|
buildstate->listSums[closestCenter] += minDistance;
|
||||||
|
buildstate->listCounts[closestCenter]++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Create a virtual tuple */
|
/* Create a virtual tuple */
|
||||||
@@ -345,6 +347,8 @@ InitBuildState(IvfflatBuildState * buildstate, Relation heap, Relation index, In
|
|||||||
|
|
||||||
#ifdef IVFFLAT_KMEANS_DEBUG
|
#ifdef IVFFLAT_KMEANS_DEBUG
|
||||||
buildstate->inertia = 0;
|
buildstate->inertia = 0;
|
||||||
|
buildstate->listSums = palloc0(sizeof(double) * buildstate->lists);
|
||||||
|
buildstate->listCounts = palloc0(sizeof(int) * buildstate->lists);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,6 +361,11 @@ FreeBuildState(IvfflatBuildState * buildstate)
|
|||||||
pfree(buildstate->centers);
|
pfree(buildstate->centers);
|
||||||
pfree(buildstate->listInfo);
|
pfree(buildstate->listInfo);
|
||||||
pfree(buildstate->normvec);
|
pfree(buildstate->normvec);
|
||||||
|
|
||||||
|
#ifdef IVFFLAT_KMEANS_DEBUG
|
||||||
|
pfree(buildstate->listSums);
|
||||||
|
pfree(buildstate->listCounts);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -503,6 +512,40 @@ CreateEntryPages(IvfflatBuildState * buildstate, ForkNumber forkNum)
|
|||||||
|
|
||||||
#ifdef IVFFLAT_KMEANS_DEBUG
|
#ifdef IVFFLAT_KMEANS_DEBUG
|
||||||
elog(INFO, "inertia: %.3e", buildstate->inertia);
|
elog(INFO, "inertia: %.3e", buildstate->inertia);
|
||||||
|
|
||||||
|
/* Calculate Davies-Bouldin index */
|
||||||
|
if (buildstate->lists > 1)
|
||||||
|
{
|
||||||
|
double db = 0.0;
|
||||||
|
|
||||||
|
/* Calculate average distance */
|
||||||
|
for (int i = 0; i < buildstate->lists; i++)
|
||||||
|
{
|
||||||
|
if (buildstate->listCounts[i] > 0)
|
||||||
|
buildstate->listSums[i] /= buildstate->listCounts[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < buildstate->lists; i++)
|
||||||
|
{
|
||||||
|
double max = 0.0;
|
||||||
|
double distance;
|
||||||
|
|
||||||
|
for (int j = 0; j < buildstate->lists; j++)
|
||||||
|
{
|
||||||
|
if (j == i)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
distance = DatumGetFloat8(FunctionCall2Coll(buildstate->procinfo, buildstate->collation, PointerGetDatum(VectorArrayGet(buildstate->centers, i)), PointerGetDatum(VectorArrayGet(buildstate->centers, j))));
|
||||||
|
distance = (buildstate->listSums[i] + buildstate->listSums[j]) / distance;
|
||||||
|
|
||||||
|
if (distance > max)
|
||||||
|
max = distance;
|
||||||
|
}
|
||||||
|
db += max;
|
||||||
|
}
|
||||||
|
db /= buildstate->lists;
|
||||||
|
elog(INFO, "davies-bouldin: %.3f", db);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Insert */
|
/* Insert */
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ typedef struct IvfflatBuildState
|
|||||||
|
|
||||||
#ifdef IVFFLAT_KMEANS_DEBUG
|
#ifdef IVFFLAT_KMEANS_DEBUG
|
||||||
double inertia;
|
double inertia;
|
||||||
|
double *listSums;
|
||||||
|
int *listCounts;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Sampling */
|
/* Sampling */
|
||||||
|
|||||||
Reference in New Issue
Block a user