public static double similarityNumberVector(NumberVector o1,NumberVector o2){
  final int d1=o1.getDimensionality(), d2=o2.getDimensionality();
  int intersection=0, union=0;
  int d=0;
  for (; d < d1 && d < d2; d++) {
    double v1=o1.doubleValue(d), v2=o2.doubleValue(d);
    if (v1 != v1 || v2 != v2) {
      continue;
    }
    if (v1 != 0. || v2 != 0) {
      ++union;
      if (v1 == v2) {
        ++intersection;
      }
    }
  }
  for (; d < d1; d++) {
    if (o1.doubleValue(d) != 0) {
      ++union;
    }
  }
  for (; d < d2; d++) {
    if (o2.doubleValue(d) != 0) {
      ++union;
    }
  }
  return intersection / (double)union;
}

public static double similarityNumberVector ( NumberVector o1 , NumberVector o2 ) { final int d1 = o1 . getDimensionality ( ) , d2 = o2 . getDimensionality ( ) ; int intersection = 0 , union = 0 ; int d = 0 ; for ( ; d < d1 && d < d2 ; d ++ ) { double v1 = o1 . doubleValue ( d ) , v2 = o2 . doubleValue ( d ) ; if ( v1 != v1 || v2 != v2 ) { continue ; } if ( v1 != 0. || v2 != 0 ) { ++ union ; if ( v1 == v2 ) { ++ intersection ; } } } for ( ; d < d1 ; d ++ ) { if ( o1 . doubleValue ( d ) != 0 ) { ++ union ; } } for ( ; d < d2 ; d ++ ) { if ( o2 . doubleValue ( d ) != 0 ) { ++ union ; } } return intersection / ( double ) union ; }
compute jaccard similarity for two number vectors .
