diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/km-solve.c | 37 | ||||
| -rw-r--r-- | src/km.h | 5 | 
2 files changed, 9 insertions, 33 deletions
diff --git a/src/km-solve.c b/src/km-solve.c index f579a41..4730eb4 100644 --- a/src/km-solve.c +++ b/src/km-solve.c @@ -5,7 +5,7 @@  #include "util.h"  #include "km.h" -#define MIN_CLUSTER_DISTANCE 0.00001 +#define MIN_DELTA 0.00001  // alloc and initialize row map  static km_row_map_t * @@ -142,38 +142,21 @@ km_solve(    if (cbs && cbs->on_stats) {      float sum = 0, -          silouette = 0, -          mean_dists[num_clusters], -          mean_nears[num_clusters]; - -    memset(mean_dists, 0, sizeof(mean_dists)); -    memset(mean_nears, 0, sizeof(mean_nears)); - -    // calculate sum of distances across all clusters -    for (size_t i = 0; i < set->num_rows; i++) { -      sum += row_map[i].d2; -    } +          silouette = 0;      // calculate mean numerators and silouette      for (size_t i = 0; i < set->num_rows; i++) { -      // distance squared (d2) to center of this cluster -      mean_dists[row_map[i].cluster] += row_map[i].d2; - -      // distance squared (d2) to center of nearest cluster -      mean_nears[row_map[i].cluster] += row_map[i].d2_near; +      // sum distances +      sum += row_map[i].d2;        // calculate silouette denominator        // (https://en.wikipedia.org/wiki/Silhouette_%28clustering%29) -      const float delta = row_map[i].d2_near - row_map[i].d2; -      if (fabsf(delta) > MIN_CLUSTER_DISTANCE) { -        silouette += delta / MAX(row_map[i].d2, row_map[i].d2_near); -      } -    } +      const float delta = (row_map[i].d2_near - row_map[i].d2); -    // finalize means (divide by row count) -    for (size_t i = 0; i < num_clusters; i++) { -      mean_dists[i] = (cs->ints[i]) ? (sqrt(mean_dists[i]) / cs->ints[i]) : 0; -      mean_nears[i] = (cs->ints[i]) ? (sqrt(mean_nears[i]) / cs->ints[i]) : 0; +      // sum silouette +      silouette += (delta < -MIN_DELTA || delta > MIN_DELTA) +        ? (delta / MAX(row_map[i].d2, row_map[i].d2_near)) +        : 0.0;      }      // finalize silouette @@ -183,8 +166,6 @@ km_solve(      const km_solve_stats_t stats = {        .sum          = sum,        .silouette    = silouette, -      .mean_dists   = mean_dists, -      .mean_nears   = mean_nears,        .num_clusters = num_clusters,      }; @@ -94,12 +94,7 @@ typedef struct {  typedef struct {    const float sum; -    const float silouette; - -  const float *mean_dists; -  const float *mean_nears; -    const size_t num_clusters;  } km_solve_stats_t;  | 
