[Scipy-svn] r2296 - in trunk/Lib/sandbox/pyem: . tests

scipy-svn at scipy.org scipy-svn at scipy.org
Tue Oct 24 05:37:33 EDT 2006


Author: cdavid
Date: 2006-10-24 04:37:27 -0500 (Tue, 24 Oct 2006)
New Revision: 2296

Modified:
   trunk/Lib/sandbox/pyem/Changelog
   trunk/Lib/sandbox/pyem/gmm_em.py
   trunk/Lib/sandbox/pyem/tests/test_gmm_em.py
Log:
 * sandbox.pyem: fix a bug which prevents full covariance
 from being used + tests to avoid this issue 
 from being unnoticed



Modified: trunk/Lib/sandbox/pyem/Changelog
===================================================================
--- trunk/Lib/sandbox/pyem/Changelog	2006-10-23 10:52:27 UTC (rev 2295)
+++ trunk/Lib/sandbox/pyem/Changelog	2006-10-24 09:37:27 UTC (rev 2296)
@@ -1,3 +1,10 @@
+pyem (0.5.5) Tue, 24 Oct 2006 18:30:54 +0900
+
+	* Fix a bug inmultiple_gaussian_den which prevents 
+	full covariance mode to work in GMM.
+	* Add consistency tests in tests/test_gmm_em.py to avoid the 
+	above bug from being detected from now on.
+
 pyem (0.5.5) Mon, 23 Oct 2006 18:48:15 +0900
 
 	* Bump to 0.5.5

Modified: trunk/Lib/sandbox/pyem/gmm_em.py
===================================================================
--- trunk/Lib/sandbox/pyem/gmm_em.py	2006-10-23 10:52:27 UTC (rev 2295)
+++ trunk/Lib/sandbox/pyem/gmm_em.py	2006-10-24 09:37:27 UTC (rev 2296)
@@ -1,5 +1,5 @@
 # /usr/bin/python
-# Last Change: Mon Oct 23 06:00 PM 2006 J
+# Last Change: Tue Oct 24 06:00 PM 2006 J
 
 # TODO:
 #   - which methods to avoid va shrinking to 0 ? There are several options, 
@@ -318,11 +318,10 @@
         return y.T
     else:
         for i in range(K):
-            y[:, i] = densities.gauss_den(data, mu[i, :], 
+            y[i] = densities.gauss_den(data, mu[i, :], 
                         va[d*i:d*i+d, :])
+        return y.T
 
-    return y
-
 if __name__ == "__main__":
     import copy
     #=============================

Modified: trunk/Lib/sandbox/pyem/tests/test_gmm_em.py
===================================================================
--- trunk/Lib/sandbox/pyem/tests/test_gmm_em.py	2006-10-23 10:52:27 UTC (rev 2295)
+++ trunk/Lib/sandbox/pyem/tests/test_gmm_em.py	2006-10-24 09:37:27 UTC (rev 2296)
@@ -1,11 +1,92 @@
 #! /usr/bin/env python
-# Last Change: Fri Oct 20 11:00 AM 2006 J
+# Last Change: Tue Oct 24 06:00 PM 2006 J
 
+# For now, just test that all mode/dim execute correctly
+
 import sys
 from numpy.testing import *
 
 import numpy as N
 
 set_package_path()
-from pyem.densities import gauss_den
+from pyem import GMM, GM, EM
 restore_path()
+
+class EmTest(NumpyTestCase):
+    def _create_model_and_run_em(self, d, k, mode, nframes):
+        #+++++++++++++++++++++++++++++++++++++++++++++++++
+        # Generate a model with k components, d dimensions
+        #+++++++++++++++++++++++++++++++++++++++++++++++++
+        w, mu, va   = GM.gen_param(d, k, mode, spread = 1.5)
+        gm          = GM.fromvalues(w, mu, va)
+        # Sample nframes frames  from the model
+        data        = gm.sample(nframes)
+
+        #++++++++++++++++++++++++++++++++++++++++++
+        # Approximate the models with classical EM
+        #++++++++++++++++++++++++++++++++++++++++++
+        # Init the model
+        lgm = GM(d, k, mode)
+        gmm = GMM(lgm, 'kmean')
+
+        em  = EM()
+        lk  = em.train(data, gmm)
+
+class test_full(EmTest):
+    def check_1d(self, level = 1):
+        d       = 1
+        k       = 2
+        mode    = 'full'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+    def check_2d(self, level = 1):
+        d       = 2
+        k       = 2
+        mode    = 'full'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+    def check_5d(self, level = 1):
+        d       = 5
+        k       = 3
+        mode    = 'full'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+class test_diag(EmTest):
+    def check_1d(self, level = 1):
+        d       = 1
+        k       = 2
+        mode    = 'diag'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+    def check_2d(self, level = 1):
+        d       = 2
+        k       = 2
+        mode    = 'diag'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+    def check_5d(self, level = 1):
+        d       = 5
+        k       = 3
+        mode    = 'diag'
+        nframes = int(1e2)
+
+        #seed(1)
+        self._create_model_and_run_em(d, k, mode, nframes)
+
+if __name__ == "__main__":
+    NumpyTest().run()




More information about the Scipy-svn mailing list