Example #1
0
    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
Example #2
0
 def compare(v, s):
     assert_equal(bit_vector_to_str(v), s)