[Scipy-svn] r2050 - in trunk/Lib/sandbox/svm: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Thu Jul 6 22:00:42 EDT 2006


Author: fullung
Date: 2006-07-06 21:00:33 -0500 (Thu, 06 Jul 2006)
New Revision: 2050

Added:
   trunk/Lib/sandbox/svm/tests/test_kernel.py
Modified:
   trunk/Lib/sandbox/svm/kernel.py
Log:
Fix kernels.


Modified: trunk/Lib/sandbox/svm/kernel.py
===================================================================
--- trunk/Lib/sandbox/svm/kernel.py	2006-07-07 01:03:44 UTC (rev 2049)
+++ trunk/Lib/sandbox/svm/kernel.py	2006-07-07 02:00:33 UTC (rev 2050)
@@ -6,24 +6,22 @@
     'CustomKernel'
     ]
 
+import numpy as N
+
 class LinearKernel:
-    def __init__(self, dot):
-        self.dot = dot
+    def __call__(self, x, y, dot):
+        return dot(x, y)
 
-    def __call__(self, x, y):
-        return self.dot(x, y)
-
 class PolynomialKernel:
-    def __init__(self, degree, gamma, coef0, dot):
+    def __init__(self, degree, gamma, coef0):
         self.degree = degree
         self.gamma = gamma
         self.coef0 = coef0
-        self.dot = dot
 
-    def __call__(self, x, y):
-        base = self.gamma*self.dot(x, y) + self.coef0
+    def __call__(self, x, y, dot):
+        base = self.gamma*dot(x, y) + self.coef0
         tmp = base
-        ret = 1.
+        ret = 1.0
         t = self.degree
         while t > 0:
             if t % 2 == 1: ret *= tmp
@@ -32,27 +30,24 @@
         return ret
 
 class RBFKernel:
-    def __init__(self, gamma, dot):
+    def __init__(self, gamma):
         self.gamma = gamma
-        self.dot = dot
 
-    def __call__(self, x, y):
-        z = self.dot(x, x) + self.dot(y, y) - 2*self.dot(x, y)
+    def __call__(self, x, y, dot):
+        z = dot(x, x) + dot(y, y) - 2*dot(x, y)
         return N.exp(-self.gamma*z)
 
 class SigmoidKernel:
-    def __init__(self, gamma, coef0, dot):
+    def __init__(self, gamma, coef0):
         self.gamma = gamma
         self.coef0 = coef0
-        self.dot = dot
 
-    def kernel_sigmoid(x, y, gamma, coef0):
-        return N.tanh(self.gamma*self.dot(x, y)+self.coef0)
+    def __call__(self, x, y, dot):
+        return N.tanh(self.gamma*dot(x, y)+self.coef0)
 
 class CustomKernel:
-    def __init__(self, f, dot):
+    def __init__(self, f):
         self.f = f
-        self.dot = dot
 
-    def __call__(self, x, y):
+    def __call__(self, x, y, dot):
         return self.f(x, y, dot)

Added: trunk/Lib/sandbox/svm/tests/test_kernel.py
===================================================================
--- trunk/Lib/sandbox/svm/tests/test_kernel.py	2006-07-07 01:03:44 UTC (rev 2049)
+++ trunk/Lib/sandbox/svm/tests/test_kernel.py	2006-07-07 02:00:33 UTC (rev 2050)
@@ -0,0 +1,41 @@
+from numpy.testing import *
+import numpy as N
+
+from svm.kernel import *
+
+class test_kernel(NumpyTestCase):
+    def check_linear_kernel(self):
+        kernel = LinearKernel()
+        dot = N.dot
+        x = N.array([2.])
+        self.assertAlmostEqual(kernel(x, x, dot), 4.)
+
+    def check_polynomial_kernel(self):
+        kernel = PolynomialKernel(degree=6, gamma=1.0, coef0=1.0)
+        dot = N.dot
+        x = N.array([2.])
+        self.assertAlmostEqual(kernel(x, x, dot), 15625.)
+
+    def check_sigmoid_kernel(self):
+        kernel = SigmoidKernel(gamma=0.2, coef0=0.3)
+        dot = N.dot
+        x = N.array([2.])
+        self.assertAlmostEqual(kernel(x, x, dot), 0.80049902)
+
+    def check_rbf_kernel(self):
+        kernel = RBFKernel(gamma=1.0)
+        dot = N.dot
+        x, y = N.array([2.]), N.array([3.])
+        self.assertAlmostEqual(kernel(x, y, dot), N.exp(-1.))
+
+    def check_custom_kernel(self):
+        def f(x, y, dot):
+            return 4 * dot(x, y)
+        kernel = CustomKernel(f)
+        def dot(x, y):
+            return 2 * N.dot(x, y)
+        x = N.array([2.])
+        self.assertAlmostEqual(kernel(x, x, dot), 32.0)
+
+if __name__ == '__main__':
+    NumpyTest().run()




More information about the Scipy-svn mailing list