Source code for pySPACE.tests.unittests.nodes.spatial_filtering.test_fda

#!/usr/bin/python

"""
This module contains unittests that test splitter nodes

:Author: Jan Hendrik Metzen (jhm@informatik.uni-bremen.de)
:Created: 2008/12/18
"""

import unittest
import numpy

if __name__ == '__main__':
    import sys
    import os
    # The root of the code
    file_path = os.path.dirname(os.path.abspath(__file__))
    sys.path.append(file_path[:file_path.rfind('pySPACE')-1])

from pySPACE.resources.data_types.time_series import TimeSeries
from pySPACE.missions.nodes.spatial_filtering.fda import FDAFilterNode

[docs]class FDAFilterTestCase(unittest.TestCase): """Test for FDAFilterNode"""
[docs] def setUp(self): samples = 5000 ranges = [-3.5, 3.5, -3.5, 3.5] numpy.random.seed(0) true_data = numpy.zeros((samples, 2)) true_data[:,0] = numpy.random.normal(loc=0.0, scale=1.0, size=(samples,)) true_data[:,1] = numpy.random.normal(loc=0.0, scale=0.5, size=(samples,)) self.classes = [-1 if x < 0 else 1 for x in true_data[:,1]] mixed_data = numpy.zeros((samples,2)) for i in range(samples): mixed_data[i,0] = 0.6*true_data[i,0] + 0.4*true_data[i,1] + 1.0 mixed_data[i,1] = 0.4*true_data[i,0] - 0.6*true_data[i,1] + 1.5 self.data = numpy.zeros(mixed_data.shape) self.data[:,0] = mixed_data[:,0] - numpy.mean(mixed_data[:,1]) self.data[:,1] = mixed_data[:,1] - numpy.mean(mixed_data[:,1]) self.data = [TimeSeries(data, channel_names = [("test_channel_%s" % j) for j in range(2)], sampling_frequency = 10) for data in self.data]
[docs] def test_fda(self): """ Tests that FDA produces the expected transformation matrix on the data """ fda_node = FDAFilterNode(retained_channels=2) for i,data in enumerate(self.data): fda_node.train(data, self.classes[i]) fda_node.stop_training() self.assert_(numpy.allclose(fda_node.filters, numpy.array([[1.56207903, -1.15805762], [-2.32599494, -0.79980837]])), "FDA transformation matrix is wrong!") transformed_data = [] for i,data in enumerate(self.data): ts = TimeSeries(input_array = data, channel_names = [("test_channel_%s" % j) for j in range(2)], sampling_frequency = 10, start_time = 0, end_time = 1) transformed_data.append(fda_node.execute(ts).view(numpy.ndarray)) self.assert_(numpy.allclose(transformed_data[0:2], [numpy.array([[ -0.45549484, -1.20700466]]), numpy.array([[ -1.52271298, 0.16829469]])]), "FDA-transformed data does not match expectation!")
# self.plot(self.data, transformed_data)
[docs] def plot(self, original_data, transformed_data): import pylab pylab.figure(1) pylab.subplot(1,2,1) pylab.gcf().subplots_adjust(left=0.04, bottom=0.04, right=0.96, top= 0.96) pylab.scatter(original_data[:,0], original_data[:,1], color = ['r' if c==1 else 'b' for c in self.classes], marker = 'o') pylab.title("Original") pylab.subplot(1,2,2) pylab.scatter(transformed_data[:,0], transformed_data[:,1], color = ['r' if c==1 else 'b' for c in self.classes], marker = 'o') pylab.title("Transformed") pylab.show()
# self.assert_(found, "One data point is never used for testing in cv splitting") if __name__ == '__main__': suite = unittest.TestLoader().loadTestsFromName('test_fda') unittest.TextTestRunner(verbosity=2).run(suite)