Beispiel #1
0
  virtual double compute( const Clustering& c1, const Clustering& c2 ) const {
    size_t c1_sum2 = 0;
    size_t n = 0;
    for (size_t i=0; i < c1.size(); i++) {
      c1_sum2 += c1[i].size() * c1[i].size();
      n += c1[i].size();
    }

    size_t c2_sum2 = 0;
    for (size_t i=0; i < c2.size(); i++) {
      c2_sum2 += c2[i].size() * c2[i].size();    
    }  

    size_t c1c2_sum2 = 0;
    for (size_t i=0; i < c1.size(); i++) {
      for (size_t j=0; j < c2.size(); j++) {
        size_t size;
        std::set_intersection( c1[i].begin(), c1[i].end(), 
                               c2[j].begin(), c2[j].end(),
                               counter(size) );
        c1c2_sum2 += size * size;
      }
    }

    return ( c1_sum2 + c2_sum2 - (2 * c1c2_sum2) ) / (double)(n*n);
  }