def score(self, imgs, labels): idx = np.in1d(labels, self.digits) imgs, labels = imgs[idx], labels[idx] # Compute the digit counts for each top-level pattern. machine = self.machine sample_count = 10 self.digit_dists = digit_dists = {} for img, label in izip(imgs, labels): samples = machine.sample_recognition_dist(img, size=sample_count) for top_sample in samples[0]: pattern = bit_vector_to_str(top_sample) dist = digit_dists.setdefault(pattern, np.zeros(10)) dist[label] += 1 # Tranform digit counts to distributions. total_count = len(imgs) * sample_count self.pattern_dist = pattern_dist = {} for pattern, digit_dist in digit_dists.iteritems(): pattern_count = digit_dist.sum() pattern_dist[pattern] = pattern_count / total_count digit_dist /= pattern_count # Compute the normalized digit specificity score. score = 0.0 n = len(self.digits) for pattern, weight in pattern_dist.iteritems(): p = digit_dists[pattern] p = p[p != 0] # Set p log p = 0 when p == 0. score += weight * np.sum(p * np.log(n*p)) score /= np.log(n) self.specificity = score return score
def compare(v, s): assert_equal(bit_vector_to_str(v), s)