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

scipy-svn at scipy.org scipy-svn at scipy.org
Wed Jul 26 09:19:31 EDT 2006


Author: fullung
Date: 2006-07-26 08:18:54 -0500 (Wed, 26 Jul 2006)
New Revision: 2133

Modified:
   trunk/Lib/sandbox/svm/dataset.py
   trunk/Lib/sandbox/svm/tests/test_classification.py
Log:
Extend classification tests.


Modified: trunk/Lib/sandbox/svm/dataset.py
===================================================================
--- trunk/Lib/sandbox/svm/dataset.py	2006-07-26 12:38:37 UTC (rev 2132)
+++ trunk/Lib/sandbox/svm/dataset.py	2006-07-26 13:18:54 UTC (rev 2133)
@@ -165,6 +165,9 @@
     def __init__(self, origdata):
         self.data = map(lambda x: convert_to_svm_node(x), origdata)
 
+    def __len__(self):
+        return len(self.data)
+
     def __iter__(self):
         return self.data.__iter__()
 

Modified: trunk/Lib/sandbox/svm/tests/test_classification.py
===================================================================
--- trunk/Lib/sandbox/svm/tests/test_classification.py	2006-07-26 12:38:37 UTC (rev 2132)
+++ trunk/Lib/sandbox/svm/tests/test_classification.py	2006-07-26 13:18:54 UTC (rev 2133)
@@ -10,101 +10,93 @@
 
 class test_classification(NumpyTestCase):
     def check_basics(self):
-        Model = LibSvmCClassificationModel
         kernel = LinearKernel()
-        Model(kernel)
-        Model(kernel, cost=1.0)
+        # C-SVC
+        ModelType = LibSvmCClassificationModel
+        ModelType(kernel)
+        ModelType(kernel, cost=1.0)
         weights = [(2, 10.0), (1, 20.0), (0, 30.0)]
-        Model(kernel, weights=weights)
-        Model(kernel, 1.0, weights)
-        Model(kernel, cost=1.0, weights=weights)
+        ModelType(kernel, weights=weights)
+        ModelType(kernel, 1.0, weights)
+        ModelType(kernel, cost=1.0, weights=weights)
+        # nu-SVC
+        ModelType = LibSvmNuClassificationModel
+        ModelType(kernel)
+        ModelType(kernel, nu=0.5)
+        ModelType(kernel, weights=weights)
+        ModelType(kernel, 0.5, weights)
 
-        Model = LibSvmNuClassificationModel
-        Model(kernel)
-        Model(kernel, nu=0.5)
-        Model(kernel, weights=weights)
-        Model(kernel, 0.5, weights)
-
-    def check_c_basics(self):
-        ModelType = LibSvmCClassificationModel
-
+    def _make_basic_datasets(self):
         labels = [0, 1, 1, 2]
         x = [N.array([0, 0]),
              N.array([0, 1]),
              N.array([1, 0]),
              N.array([1, 1])]
         traindata = LibSvmClassificationDataSet(zip(labels, x))
-        model = ModelType(RBFKernel(traindata.gamma))
+        testdata = LibSvmTestDataSet(x)
+        return traindata, testdata
+
+    def check_c_basics(self):
+        traindata, testdata = self._make_basic_datasets()
+        kernel = RBFKernel(traindata.gamma)
+        model = LibSvmCClassificationModel(kernel)
         results = model.fit(traindata)
-        testdata = LibSvmTestDataSet(x)
-        results.predict(testdata)
+        p = results.predict(testdata)
+        assert_array_equal(p, [1, 1, 1, 1])
         results.predict_values(testdata)
 
-    def check_c_more(self):
-        ModelType = LibSvmCClassificationModel
-
-        labels = [0, 1, 1, 2]
-        x = [N.array([0, 0]),
-             N.array([0, 1]),
-             N.array([1, 0]),
-             N.array([1, 1])]
-        traindata = LibSvmClassificationDataSet(zip(labels, x))
-        cost = 10.0
-        weights = [(1, 10.0)]
-        testdata = LibSvmTestDataSet(x)
-
+    def _make_basic_kernels(self, gamma):
         kernels = [
             LinearKernel(),
-            PolynomialKernel(3, traindata.gamma, 0.0),
-            RBFKernel(traindata.gamma)
+            PolynomialKernel(3, gamma, 0.0),
+            RBFKernel(gamma)
             ]
-        expected_rhos = [
-            [-0.999349, -1.0, -3.0],
-            [0.375, -1.0, -1.153547],
-            [0.671181, 0.0, -0.671133]
-            ]
-        expected_errors = [0, 1, 0]
+        return kernels
 
-        for kernel, expected_rho, expected_error in \
-            zip(kernels, expected_rhos, expected_errors):
-            model = ModelType(kernel, cost, weights)
+    def _classify_basic(self, ModelType,
+                        modelargs, expected_rhos, expected_ps):
+        traindata, testdata = self._make_basic_datasets()
+        kernels = self._make_basic_kernels(traindata.gamma)
+        for kernel, expected_rho, expected_p in \
+                zip(kernels, expected_rhos, expected_ps):
+            args = (kernel,) + modelargs
+            model = ModelType(*args)
             results = model.fit(traindata)
-
             self.assertEqual(results.labels, [0, 1, 2])
-            self.assertEqual(results.nSV, [1, 2, 1])
-
-            # use decimal=4 to suppress slight differences in values
-            # calculated for rho on Windows with MSVC 7.1 and on
-            # Fedora Core 4 with GCC 4.0.0.
+            # decimal=4 due to compiler-dependent variations in rho
             assert_array_almost_equal(results.rho, expected_rho, decimal=4)
+            p = N.array(results.predict(testdata))
+            assert_array_equal(p, expected_p)
 
-            predictions = N.array(results.predict(testdata))
-            self.assertEqual(N.sum(predictions != labels), expected_error)
+    def check_c_more(self):
+        cost = 10.0
+        weights = [(1, 10.0)]
+        modelargs = cost, weights
+        expected_rhos = [[-0.999349, -1.0, -3.0],
+                         [0.375, -1.0, -1.153547],
+                         [0.671181, 0.0, -0.671133]]
+        expected_ps = [[0, 1, 1, 2], [1, 1, 1, 2], [0, 1, 1, 2]]
+        self._classify_basic(LibSvmCClassificationModel,
+                             modelargs, expected_rhos, expected_ps)
 
     def check_c_probability(self):
-        ModelType = LibSvmCClassificationModel
-
-        labels = [0, 1, 1, 2]
-        x = [N.array([0, 0]),
-             N.array([0, 1]),
-             N.array([1, 0]),
-             N.array([1, 1])]
-        traindata = LibSvmClassificationDataSet(zip(labels, x))
+        traindata, testdata = self._make_basic_datasets()
+        nu = 0.5
         cost = 10.0
         weights = [(1, 10.0)]
-        testdata = LibSvmTestDataSet(x)
-
-        kernels = [
-            LinearKernel(),
-            PolynomialKernel(3, traindata.gamma, 0.0),
-            RBFKernel(traindata.gamma)
+        kernels = self._make_basic_kernels(traindata.gamma)
+        models = [
+            (LibSvmCClassificationModel, (cost, weights)),
+            (LibSvmNuClassificationModel, (nu, weights))
             ]
+        for ModelType, modelargs in models:
+            for kernel in kernels:
+                args = (kernel,) + modelargs
+                kwargs = {'probability' : True}
+                model = ModelType(*args, **kwargs)
+                results = model.fit(traindata)
+                results.predict_probability(testdata)
 
-        for kernel in kernels:
-            model = ModelType(kernel, cost, weights, True)
-            results = model.fit(traindata)
-            results.predict_probability(testdata)
-
     def check_cross_validate(self):
         labels = ([-1] * 50) + ([1] * 50)
         x = N.random.randn(len(labels), 10)
@@ -116,9 +108,26 @@
         # XXX check cross-validation with and without probability
         # output enabled
 
-    def check_nu_train(self):
-        pass
+    def check_nu_basics(self):
+        traindata, testdata = self._make_basic_datasets()
+        kernel = RBFKernel(traindata.gamma)
+        model = LibSvmNuClassificationModel(kernel)
+        results = model.fit(traindata)
+        p = results.predict(testdata)
+        assert_array_equal(p, [0, 1, 1, 2])
+        v = results.predict_values(testdata)
 
+    def check_nu_more(self):
+        nu = 0.5
+        weights = [(1, 10.0)]
+        modelargs = nu, weights
+        expected_rhos = [[-1.0, -1.0, -3.0],
+                         [-1.0, -1.0, -1.15384846],
+                         [0.6712142, 0.0, -0.6712142]]
+        expected_ps = [[0, 1, 1, 2]] * 3
+        self._classify_basic(LibSvmNuClassificationModel,
+                             modelargs, expected_rhos, expected_ps)
+
     def _make_datasets(self):
         labels1 = N.random.random_integers(0, 2, 100)
         x1 = N.random.randn(len(labels1), 10)




More information about the Scipy-svn mailing list