1 """Subroutines for q_classifier.py that implement a multi-mu model.
2 That is, one where all the classes share a common covariance matrix.
3 """
4
5 import math
6 import multivariance as M
7 import q_classifier as QC
8 from gmisclib import dictops
9
10 HUGE = 1e30
11
13 """How many examples of each class do we have?"""
14 counts = {}
15 for datum in data:
16 dictops.add_doc(counts, datum.classid, 1)
17 return counts
18
19
20
22 """Builds a set of quadratic classifiers.
23 Data is a list of datum_tr .
24 It returns a list: [ (evaluation_result, classifier_description), ... ] ."""
25
26 assert modelchoice==M.multi_mu or modelchoice==M.multi_mu_diag
27
28 cprms = M.meanvar(data, N, modelchoice)
29 assert isinstance(cprms[0], M.multi_mu_with_numbers) \
30 or isinstance(cprms[0], M.multi_mu_diag_with_numbers)
31
32 classlist = cprms[0].desc.int_to_id.values()
33
34 if modelchoice==M.multi_mu_diag:
35 details = M.diag_quadratic(ndim=cprms[0].desc.ndim())
36 elif modelchoice==M.multi_mu:
37 details = M.quadratic(ndim=cprms[0].desc.ndim())
38 else:
39 RuntimeError, 'Cannot happen'
40
41 classcounts = count_the_classes(data)
42
43 classifiers = []
44 for tmp in cprms:
45 qc = QC.classifier()
46 for c in classlist:
47
48
49 bias = math.log(classcounts[c])
50 if modelchoice==M.multi_mu_diag:
51 q = M.diag_quadratic_with_numbers(tmp.mu[c], tmp.invsigma, \
52 details, bias)
53 elif modelchoice==M.multi_mu:
54 q = M.quadratic_with_numbers(tmp.mu[c], tmp.invsigma,
55 details, bias)
56 else:
57 RuntimeError, 'Cannot happen'
58 qc.addQuad(c, q)
59 classifiers.append(qc)
60 return classifiers
61