# source:orange/orange/doc/ofb/bayes.py@6538:a5f65d7f0b2c

Revision 6538:a5f65d7f0b2c, 3.2 KB checked in by Mitar <Mitar@…>, 4 years ago (diff)

Made XPM version of the icon 32x32.

Line
1# Description: Class that implements the naive Bayesian learner and classifier (warning: just for educational purposes, for real, use naive Bayes as implemented in core Orange)
2# Category:    modelling
3# Referenced:  c_nb.htm
4
5import orange
6
7class Learner(object):
8    def __new__(cls, examples=None, **kwds):
9        learner = object.__new__(cls, **kwds)
10        if examples:
11            learner.__init__(**kwds)
12            return learner(examples)
13        else:
14            return learner
15
16    def __init__(self, m=0.0, name='std naive bayes', **kwds):
17        self.__dict__.update(kwds)
18        self.m = m
19        self.name = name
20
21    def __call__(self, examples, weight=None, **kwds):
22        for k in kwds.keys():
23            self.__dict__[k] = kwds[k]
24        domain = examples.domain
25
26        # first, compute class probabilities
27        n_class = [0.] * len(domain.classVar.values)
28        for e in examples:
29            n_class[int(e.getclass())] += 1
30
31        p_class = [0.] * len(domain.classVar.values)
32        for i in range(len(domain.classVar.values)):
33            p_class[i] = n_class[i] / len(examples)
34
35        # count examples with specific attribute and
36        # class value, pc[attribute][value][class]
37
38        # initialization of pc
39        pc = []
40        for i in domain.attributes:
41            p = [[0.]*len(domain.classVar.values) for i in range(len(i.values))]
42            pc.append(p)
43
44        # count instances, store them in pc
45        for e in examples:
46            c = int(e.getclass())
47            for i in range(len(domain.attributes)):
48                if not e[i].isSpecial():
49                    pc[i][int(e[i])][c] += 1.0
50
51        # compute conditional probabilities
52        for i in range(len(domain.attributes)):
53            for j in range(len(domain.attributes[i].values)):
54                for k in range(len(domain.classVar.values)):
55                    pc[i][j][k] = (pc[i][j][k] + self.m * p_class[k])/ \
56                                  (n_class[k] + self.m)
57
58        return Classifier(m = self.m, domain=domain, p_class=p_class, \
59                                       p_cond=pc, name=self.name)
60
61class Classifier:
62    def __init__(self, **kwds):
63        self.__dict__.update(kwds)
64
65    def __call__(self, example, result_type=orange.GetValue):
66        # compute the class probabilities
67        p = map(None, self.p_class)
68        for c in range(len(self.domain.classVar.values)):
69            for a in range(len(self.domain.attributes)):
70                if not example[a].isSpecial():
71                    p[c] *= self.p_cond[a][int(example[a])][c]
72
73        # normalize probabilities to sum to 1
74        sum =0.
75        for pp in p: sum += pp
76        if sum>0:
77            for i in range(len(p)): p[i] = p[i]/sum
78
79        # find the class with highest probability
80        v_index = p.index(max(p))
81        v = orange.Value(self.domain.classVar, v_index)
82
83        # return the value based on requested return type
84        if result_type == orange.GetValue:
85            return v
86        if result_type == orange.GetProbabilities:
87            return p
88        return (v,p)
89
90    def show(self):
91        print 'm=', self.m
92        print 'class prob=', self.p_class
93        print 'cond prob=', self.p_cond
Note: See TracBrowser for help on using the repository browser.