source: orange/Orange/classification/lookup.py @ 10347:566f380f0bc5

Revision 10347:566f380f0bc5, 3.8 KB checked in by janezd <janez.demsar@…>, 2 years ago (diff)

Dedostoyevskied documentation on lookup learners, changed the order of classifiers in the index

Line 
1from Orange.misc import deprecated_keywords
2import Orange.data
3from Orange.core import \
4        LookupLearner, \
5         ClassifierByLookupTable, \
6              ClassifierByLookupTable1, \
7              ClassifierByLookupTable2, \
8              ClassifierByLookupTable3, \
9              ClassifierByExampleTable as ClassifierByDataTable
10
11
12@deprecated_keywords({"attribute":"class_var"})
13def lookup_from_bound(class_var, bound):
14    if not len(bound):
15        raise TypeError, "no bound attributes"
16    elif len(bound) <= 3:
17        return [ClassifierByLookupTable, ClassifierByLookupTable2,
18                ClassifierByLookupTable3][len(bound) - 1](class_var, *list(bound))
19    else:
20        return None
21
22   
23@deprecated_keywords({"attribute":"class_var"})
24def lookup_from_function(class_var, bound, function):
25    """
26    Construct ClassifierByDataTable or ClassifierByLookupTable
27    mirroring the given function.
28   
29    """
30    lookup = lookup_from_bound(class_var, bound)
31    if lookup:
32        for i, attrs in enumerate(Orange.misc.counters.LimitedCounter(
33                    [len(var.values) for var in bound])):
34            lookup.lookup_table[i] = Orange.data.Value(class_var, function(attrs))
35        return lookup
36    else:
37        dom = Orange.data.Domain(bound, class_var)
38        data = Orange.data.Table(dom)
39        for attrs in Orange.misc.counters.LimitedCounter(
40                    [len(var.values) for var in dom.features]):
41            data.append(Orange.data.Example(dom, attrs + [function(attrs)]))
42        return LookupLearner(data)
43     
44
45@deprecated_keywords({"learnerForUnknown":"learner_for_unknown"})
46def lookup_from_data(examples, weight=0, learner_for_unknown=None):
47    if len(examples.domain.features) <= 3:
48        lookup = lookup_from_bound(examples.domain.class_var,
49                                 examples.domain.features)
50        lookup_table = lookup.lookup_table
51        for example in examples:
52            ind = lookup.get_index(example)
53            if not lookup_table[ind].is_special() and (lookup_table[ind] !=
54                                                     example.get_class()):
55                break
56            lookup_table[ind] = example.get_class()
57        else:
58            return lookup
59
60        # there are ambiguities; a backup plan is
61        # ClassifierByDataTable, let it deal with them
62        return LookupLearner(examples, weight,
63                             learner_for_unknown=learner_for_unknown)
64
65    else:
66        return LookupLearner(examples, weight,
67                             learner_for_unknown=learner_for_unknown)
68       
69       
70def dump_lookup_function(func):
71    if isinstance(func, Orange.feature.Descriptor):
72        if not func.get_value_from:
73            raise TypeError, "attribute '%s' does not have an associated function" % func.name
74        else:
75            func = func.get_value_from
76
77    outp = ""
78    if isinstance(func, ClassifierByDataTable):
79    # XXX This needs some polishing :-)
80        for i in func.sorted_examples:
81            outp += "%s\n" % i
82    else:
83        boundset = func.boundset()
84        for a in boundset:
85            outp += "%s\t" % a.name
86        outp += "%s\n" % func.class_var.name
87        outp += "------\t" * (len(boundset)+1) + "\n"
88       
89        lc = 0
90        if len(boundset)==1:
91            cnt = Orange.misc.counters.LimitedCounter([len(x.values)+1 for x in boundset])
92        else:
93            cnt = Orange.misc.counters.LimitedCounter([len(x.values) for x in boundset])
94        for ex in cnt:
95            for i in range(len(ex)):
96                if ex[i] < len(boundset[i].values):
97                    outp += "%s\t" % boundset[i].values[ex[i]]
98                else:
99                    outp += "?\t",
100            outp += "%s\n" % func.class_var.values[int(func.lookup_table[lc])]
101            lc += 1
102    return outp
Note: See TracBrowser for help on using the repository browser.