source: orange/Orange/classification/svm/kernels.py @ 10369:3d067903408f

Revision 10369:3d067903408f, 3.8 KB checked in by janezd <janez.demsar@…>, 2 years ago (diff)

Polished documentation about SVM

Line 
1import math
2
3from Orange.core import SVMLearner as _SVMLearner
4from Orange.core import KernelFunc
5
6Linear = _SVMLearner.Linear
7Polynomial = _SVMLearner.Polynomial
8RBF = _SVMLearner.RBF
9Sigmoid = _SVMLearner.Sigmoid
10Custom = _SVMLearner.Custom
11
12class KernelWrapper(object):
13   
14    """A base class for kernel function wrappers.
15   
16    :param wrapped: a kernel function to wrap
17   
18    """
19   
20    def __init__(self, wrapped):
21        self.wrapped=wrapped
22       
23    def __call__(self, inst1, inst2):
24        return self.wrapped(inst1, inst2)
25 
26class DualKernelWrapper(KernelWrapper):
27   
28    """A base class for kernel wrapper that wraps two kernel functions.
29   
30    :param wrapped1:  first kernel function
31    :param wrapped2:  second kernel function
32   
33    """
34   
35    def __init__(self, wrapped1, wrapped2):
36        self.wrapped1=wrapped1
37        self.wrapped2=wrapped2
38       
39class RBFKernelWrapper(KernelWrapper):
40   
41    """A Kernel wrapper that wraps the given function into RBF
42   
43    :param wrapped: a kernel function
44    :param gamma: the gamma of the RBF
45    :type gamma: double
46   
47    """
48   
49    def __init__(self, wrapped, gamma=0.5):
50        KernelWrapper.__init__(self, wrapped)
51        self.gamma=gamma
52       
53    def __call__(self, inst1, inst2):
54        """Return :math:`exp(-gamma * wrapped(inst1, inst2) ^ 2)`
55        """
56       
57        return math.exp(
58            -self.gamma*math.pow(self.wrapped(inst1, inst2), 2))
59           
60class PolyKernelWrapper(KernelWrapper):
61   
62    """Polynomial kernel wrapper.
63   
64    :param wrapped: a kernel function
65
66    :param degree: degree of the polynomial
67    :type degree: float
68   
69    """
70   
71    def __init__(self, wrapped, degree=3.0):
72        KernelWrapper.__init__(self, wrapped)
73        self.degree=degree
74       
75    def __call__(self, inst1, inst2):
76        """Return :math:`wrapped(inst1, inst2) ^ d`"""
77       
78        return math.pow(self.wrapped(inst1, inst2), self.degree)
79
80class AdditionKernelWrapper(DualKernelWrapper):
81   
82    """
83    Addition kernel wrapper.
84
85    :param wrapped1:  first kernel function
86    :param wrapped2:  second kernel function
87
88    """
89   
90    def __call__(self, inst1, inst2):
91        """Return :math:`wrapped1(inst1, inst2) + wrapped2(inst1, inst2)`
92           
93        """
94       
95        return self.wrapped1(inst1, inst2) + self.wrapped2(inst1, inst2)
96
97class MultiplicationKernelWrapper(DualKernelWrapper):
98   
99    """
100    Multiplication kernel wrapper.
101
102    :param wrapped1:  first kernel function
103    :param wrapped2:  second kernel function
104"""
105   
106    def __call__(self, inst1, inst2):
107        """Return :math:`wrapped1(inst1, inst2) * wrapped2(inst1, inst2)`
108           
109        """
110       
111        return self.wrapped1(inst1, inst2) * self.wrapped2(inst1, inst2)
112
113class CompositeKernelWrapper(DualKernelWrapper):
114   
115    """Composite kernel wrapper.
116
117    :param wrapped1:  first kernel function
118    :param wrapped2:  second kernel function
119    :param l: coefficient
120    :type l: double
121       
122    """
123   
124    def __init__(self, wrapped1, wrapped2, l=0.5):
125        DualKernelWrapper.__init__(self, wrapped1, wrapped2)
126        self.l=l
127       
128    def __call__(self, inst1, inst2):
129        """Return :math:`l*wrapped1(inst1, inst2) + (1-l)*wrapped2(inst1, inst2)`
130           
131        """
132        return self.l * self.wrapped1(inst1, inst2) + \
133            (1-self.l) * self.wrapped2(inst1, inst2)
134
135class SparseLinKernel(object):
136    def __call__(self, inst1, inst2):
137        """
138        Compute a linear kernel function using the instances' meta attributes.
139        The meta attributes' values must be floats.
140       
141        """
142        s = set(inst1.getmetas().keys()) & set(inst2.getmetas().keys())
143        sum = 0
144        for key in s:
145            sum += float(inst2[key]) * float(inst1[key])
146        return sum
147
148BagOfWords = SparseLinKernel
Note: See TracBrowser for help on using the repository browser.