{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Implementation of an EMG-based hand gesture classifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebook by Álvaro Villoslada.\n", "\n", "**License:** [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)\n", "\n", "To view the LaTeX equations correctly rendered, it is better to [open this notebook in nbviewer](http://nbviewer.jupyter.org/github/alvipe/Mumai/blob/master/Application%20examples/Gesture%20classification/emg_classification.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we are going to learn how to apply machine learning to classify different hand gestures using the EMG signals measured on the forearm. This kind of classifiers can be used in advanced control systems for robotic hand prostheses, or as a new way of interacting with electronic devices, such as computers or mobile phones.\n", "\n", "We are going to cover the different steps that must be performed in order to go from raw EMG signals to classified gestures, namely:\n", "\n", "* [Data segmentation](#Data-segmentation)\n", "* [Feature extraction](#Feature-extraction)\n", "* [Dimensionality reduction and feature scaling](#Dimensionality-reduction-and-feature-scaling)\n", "* [Classification](#Classification)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## EMG data acquisition" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "EMG data have been acquired with two [Mumai circuits](https://hackaday.io/project/10411-mumai) from two points on the forearm: the pair of electrodes corresponding to channel 1 have been located over the flexor digitorum profundus muscle, which is in charge of flexing the fingers, and the pair of electrodes corresponding to channel 2 have been located over the extensor digitorum muscle, which is in charge of extending the fingers. During the recording session, the subject (me :D) has performed five different gestures: hand closing, hand opening, wrist flexion, wrist extension and pronation (there should be six gestures, with the addition of supination, but the system failed during the recording of this last gesture).\n", "\n", "The EMG signals have been sampled at a 1 KHz rate, with a 24 bit resolution analog-to-digital converter. Each motion has been recorded during five seconds and repeated five times, alternating with resting periods, to have enough data to train and test the classifier. In this case we are going to use static signals, so the first 100 ms of data have been removed from each signal, to eliminate transitions between rest and the performed motion, and to take into account the stabilization of the filters. The signals corresponding to each gesture and measured by each channel have been stored in a 4900x5 matrix, where each repetition is stored in a column of its corresponding motion-channel matrix. All the generated matrices have been stored in a 10 element list: five gestures measured by two acquisition channels. This makes a total of 50 different EMG signals. Each matrix of the list is labeled in the following manner: motion1_ch1, motion1_ch2, motion2_ch1, and so on." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Importing libraries and loading data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we have to import the required libraries:\n", "* **NumPy** is used to work with arrays and matrices and to use some mathematical functions, as well as to load the EMG dataset.\n", "* **scikit-learn** to perform the dimensionality reduction and scaling of the feature matrix (with the linear discriminant analysis and the min-max scaling methods, respectively) and to implement the classifier (a multiclass support vector machine), as well as to randomly split data into train and test data.\n", "* **matplotlib** is used to plot data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.cross_validation import train_test_split\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.svm import SVC\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The EMG dataset is stored in a .npy file, so the `numpy.load` method is used to load the data. We set the number of recorded gestures (`nGestures`), the number of EMG channels (`nChannels`), the number of times each gesture was repeated during the recording session (`nIterations`) and the total number of signals (`nSignals`)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "emg_data = np.load('emg_data_5class_2channel.npy',encoding='latin1').item()\n", "nGestures = 5\n", "nIterations = 5\n", "nChannels = 2\n", "nSignals = nGestures*nIterations*nChannels\n", "emg = []\n", "segmented_emg = []" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how EMG signals look. We are going to plot the EMG signals recorded by both measurement channels, corresponding to the first repetition of the closed hand gesture." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(10, 5))\n", "xlimits = (0,4900)\n", "ylimits = (-100000,100000)\n", "ax1 = fig.add_subplot(2,1,1)\n", "ax1.set_title(\"EMG signal from flexor digitorum profundus muscle (channel 1) for the closed hand gesture\")\n", "ax1.set_xlabel(\"Samples\")\n", "ax1.set_ylabel(\"ADC units\")\n", "ax1.set_xlim(xlimits)\n", "ax1.set_ylim(ylimits)\n", "ax1.plot(emg_data['motion1_ch1'][:,0])\n", "ax2 = fig.add_subplot(2,1,2)\n", "ax2.set_title(\"EMG signal from extensor digitorum muscle (channel 2) for the closed hand gesture\")\n", "ax2.set_xlabel(\"Samples\")\n", "ax2.set_ylabel(\"ADC units\")\n", "ax2.set_xlim(xlimits)\n", "ax2.set_ylim(ylimits)\n", "ax2.plot(emg_data['motion1_ch2'][:,0])\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see how the amplitude of the EMG signal measured by channel 1 (flexor digitorum profundus muscle) is greater than the amplitude of the signal measured by channel 2 (extensor digitorum muscle). This makes sense since channel 1 measures the EMG signals from the muscle in charge of closing the fingers, while channel 2 measures the signals from the muscle responsible for opening the fingers. However, apart from that, we cannot extract much more information from these raw signals at a glance. For this reason, we have to process the EMG signals, starting by segmenting them. But first, we are going to store the loaded dataset in a list of arrays with the following structure:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for m in range(1,nGestures+1):\n", " for i in range(nIterations):\n", " for c in range(1,nChannels+1):\n", " emg.append(emg_data['motion'+str(m)+'_ch'+str(c)][:,i])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data segmentation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The raw EMG signals could be used to train the classifier, but classifiers often perform better when they are fed with a set of meaningful features that describe some properties of the data. Before computing the features of the EMG data, the signals have to be segmented, that is, they have to be divided into chunks with a predefined length. There are two methods of EMG segmentation: disjoint and overlapped segmentation [1]. The first method is implemented here with the following function, which takes one EMG signal and generates a 2D matrix where the columns are the segments in which the signal is divided and the rows are the samples of each segment." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def segmentation(emg, samples = 150):\n", " N = samples # number of samples per segment\n", " S = int(np.floor(emg.shape[0]/N)) # number of segments\n", " length = 0\n", " segmented_emg = np.zeros((N,S))\n", " for s in range(S):\n", " for n in range(length,N+length):\n", " segmented_emg[n-length,s] = emg[n] # NxS matrix with a EMG signal divided in s segments, each one with n samples\n", " length = length + N\n", " length = 0\n", " return segmented_emg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We execute the segmentation function for each EMG signal in the dataset, to generate a list containing all the segmented signals." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for n in range(nSignals):\n", " segmented_emg.append(segmentation(emg[n]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature extraction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The features that are going to be computed are some of the time domain features described in [2]. These features are commonly used in EMG feature extraction because they are easy to compute and give meaningful information regarding the amplitude, frequency and duration of the signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Mean absolute value:** it gives information about muscle contraction levels. It is defined as\n", "\n", "\\begin{equation}\n", "MAV_{k} = \\dfrac{1}{N} \\sum\\limits_{i=1}^{N} \\vert x_{i} \\vert\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def mav(segment):\n", " mav = np.mean(np.abs(segment))\n", " return mav" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Root mean square:** it reflects the mean power of the signal and is related to the constant force and non-fatiguing contraction. It is defined as\n", "\n", "\\begin{equation}\n", "RMS_{k} = \\sqrt{\\dfrac{1}{N} \\sum\\limits_{i=1}^{N} x_{i}^{2}}\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def rms(segment):\n", " rms = np.sqrt(np.mean(np.power(segment,2)))\n", " return rms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Variance:** it is a measure of the power density of the signal. It is defined as\n", "\n", "\\begin{equation}\n", "VAR_{k} = \\dfrac{1}{N} \\sum\\limits_{i=1}^{N}\\left(x_{i}-\\overline{x}\\right)^{2}\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def var(segment):\n", " var = np.var(segment)\n", " return var" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Simple square integral:** it gives a measure of the energy of the EMG signal. It is defined as\n", "\n", "\\begin{equation}\n", "SSI_{k} = \\sum\\limits_{i=1}^{N}\\left(\\vert x_{i}^{2} \\vert\\right)\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def ssi(segment):\n", " ssi = np.sum(np.abs(np.power(segment,2)))\n", " return ssi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Zero crossings:** it is the number of times the waveform crosses zero. This feature provides an approximate estimation of frequency domain properties. The threshold avoids counting zero crossings induced by noise. It is calculated as follows\n", "\n", "Increment one unit the zero crossings count value if\n", "\n", "\\begin{equation}\n", "\\left\\lbrace x_{i} > 0 \\space and \\space x_{i+1} < 0 \\right\\rbrace \\space or \\space \\left\\lbrace x_{i} < 0 \\space and \\space x_{i+1} > 0 \\right\\rbrace \\space and \\space \\vert x_{i} - x_{i+1} \\vert \\geq threshold\n", "\\end{equation}\n", "\n", "Which can be rewritten as:\n", "\n", "\\begin{equation}\n", "ZC_{k} = \\sum\\limits_{i=1}^{N-1} \\left\\lbrace f \\left( x_{i}*x_{i+1}\\right) \\right\\rbrace;\\\\\n", "f(x) = 1, \\space if \\space x < 0 \\space and \\space \\vert x_{i} - x_{i+1} \\vert \\geq threshold\\\\\n", "f(x) = 0, \\space otherwise\n", "\\end{equation}\n", "\n", "This expression has one problem: given three consecutive data points $x_{i-1} > 0$, $x_{i} = 0$ and $x_{i+1} < 0$, the waveform has crossed zero but the zero crossing count is not incremented. If $x_{i}*x_{i+1} \\leq 0$ is used instead of $x_{i}*x_{i+1} < 0$, the zero crossing is counted twice. The code that computes the zero crossings takes all this into account, and solves it by taking only the nonzero values of the segments, as shown below." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def zc(segment):\n", " nz_segment = []\n", " nz_indices = np.nonzero(segment)[0] # Finds the indices of the segment with nonzero values\n", " for i in nz_indices:\n", " nz_segment.append(segment[i]) # The new segment contains only nonzero values \n", " N = len(nz_segment)\n", " zc = 0\n", " for n in range(N-1):\n", " if((nz_segment[n]*nz_segment[n+1]<0) and np.abs(nz_segment[n]-nz_segment[n+1]) >= 0.001):\n", " zc = zc + 1\n", " return zc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Waveform length:** it is the cumulative length of the waveform over the segment. This feature is related to the signal amplitude, frequency and time. It is defined as\n", "\n", "\\begin{equation}\n", "WL_{k} = \\sum\\limits_{i=1}^{N-1} \\vert x_{i+1} - x_{i} \\vert\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def wl(segment):\n", " wl = np.sum(np.abs(np.diff(segment)))\n", " return wl" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Slope sign changes:** it is similar to the zero crossings feature. It also provides information about the frequency content of the signal. It is calculated as follows\n", "\n", "Increment one unit the slope sign change value if\n", "\n", "\\begin{equation}\n", "\\left\\lbrace x_{i} > x_{i-1} \\space and \\space x_{i} > x_{i+1} \\right\\rbrace \\space or \\space \\left\\lbrace x_{i} < x_{i-1} \\space and \\space x_{i} < x_{i+1} \\right\\rbrace \\space and \\space \\vert x_{i}-x_{i+1} \\vert \\geq threshold \\space or \\space \\vert x_{i}-x_{i-1} \\vert \\geq threshold\n", "\\end{equation}\n", "\n", "Which can be rewritten as:\n", "\n", "\\begin{equation}\n", "SSC_{k} = \\sum\\limits_{i=2}^{N-1} \\left[ f \\left[ \\left( x_{i}-x_{i-1} \\right)* \\left( x_{i}-x_{i+1} \\right) \\right] \\right];\\\\\n", "f(x) = 1, \\space if \\space x \\geq threshold\\\\\n", "f(x) = 0, \\space otherwise\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def ssc(segment):\n", " N = len(segment)\n", " ssc = 0\n", " for n in range(1,N-1):\n", " if (segment[n]-segment[n-1])*(segment[n]-segment[n+1])>=0.001:\n", " ssc = ssc + 1\n", " return ssc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Willison amplitude:** it is the number of times that the difference of the amplitude between to adjacent data points exceed a predefined threshold. This feature provides information about the muscle contraction level. It is defined as\n", "\n", "\\begin{equation}\n", "WAMP_{k} = \\sum\\limits_{i=1}^{N-1} f(\\vert x_i-x_{i+1} \\vert);\\\\\n", "f(x) = 1, \\space if \\space x \\geq threshold\\\\\n", "f(x) = 0, \\space otherwise\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def wamp(segment):\n", " N = len(segment)\n", " wamp = 0\n", " for n in range(N-1):\n", " if np.abs(segment[n]-segment[n+1])>=50:\n", " wamp = wamp + 1\n", " return wamp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define a list containing the above functions, to execute them one after another in a for loop." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "feature_list = [mav, rms, var, ssi, zc, wl, ssc, wamp]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following function computes all the features for the same segment of both channels. First, the first feature is computed for both channels; then, the second feature is computed, and so on." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def features(segment,feature_list):\n", " features = np.zeros((1,len(segment)*len(feature_list)))\n", " i = 0\n", " for feature in feature_list:\n", " features[0,i] = feature(segment[0])\n", " features[0,i+1] = feature(segment[1])\n", " i = i + len(segment)\n", " return features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following fragment of code builds the feature matrix in the following manner:\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "nFeatures = len(feature_list)\n", "nSegments = len(segmented_emg[0][0])\n", "\n", "feature_matrix = np.zeros((nGestures*nIterations*nSegments,nFeatures*nChannels))\n", "n = 0\n", "\n", "for i in range(0,nSignals,nChannels):\n", " for j in range(nSegments):\n", " feature_matrix[n] = features((segmented_emg[i][:,j],segmented_emg[i+1][:,j]),feature_list)\n", " n = n + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Besides generating the feature matrix that is going to be used to train the classifier, we have to generate the target matrix, that is, the matrix containing the different classes corresponding to the recorded gestures. The target matrix is needed at this point to be able to perform the next step, dimensionality reduction, since the employed method requires the classes of the data to be reduced. In this case where we have five classes, the target matrix is an array in which each class is represented by a number ranging from 0 to 4." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def gestures(nSamples,nGestures):\n", " gestures = []\n", " for m in range(nGestures):\n", " gestures.append((m*np.ones((nSamples))))\n", " gestures = np.array(gestures).ravel()\n", " return gestures" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y = gestures(nSegments*nIterations,nGestures)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dimensionality reduction and feature scaling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The feature matrix that we have generated has 16 dimensions (eight features for each of the two EMG measurement channels). We could use this feature matrix to train our gesture classifier, but we can improve its performance by reducing the number of dimensions while keeping the relevant information. According to [3], there are two ways of performing this step: feature projection and feature selection. The latter method reduces the number of features by selecting the best subset of the original set, according to some criterion. In this case, we are going to implement the first method, which determines the best combination of the original features.\n", "\n", "Feature projection is generally performed using Principal Component Analysis (PCA) or Linear Discriminant Analysis (LDA). PCA is usually used in unsupervised learning tasks and works by projecting data into a subspace by retaining those characteristics of the dataset that contribute most to its variance. On the other hand, LDA is used in supervised learning tasks and its objective is to find a data projection that maximizes the separation between classes. In this case, we are going to use LDA to reduce the dimensions of the feature matrix from 16 to 2.\n", "\n", "Besides dimensionality reduction, it is advisable to standardize the range of the feature values. Depending on the employed machine learning algorithm, if the value of any of the features varies greatly, this feature can dominate over the rest and negatively influence the performance of the algorithm. For this reason, the range of all features is normalized so that each one contributes proportionately during training. To this end, the simplest method is rescaling the range of features to a new range of [0,1] or [-1,1] with the min-max algorithm.\n", "\n", "The following function implements the described steps: dimensionality reduction with LDA and feature scaling in the range [-1,1] with min-max. Besides returning the reduced and scaled feature matrix, it also returns the fitted reduction and scaling models, so that they can be applied to new data." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def feature_scaling(feature_matrix,target,reductor=None,scaler=None):\n", " lda = LDA(n_components=2) \n", " minmax = MinMaxScaler(feature_range=(-1,1))\n", " if not reductor:\n", " reductor = lda.fit(feature_matrix,target)\n", " feat_lda = reductor.transform(feature_matrix)\n", " if not scaler:\n", " scaler = minmax.fit(feat_lda)\n", " feat_lda_scaled = scaler.transform(feat_lda)\n", " \n", " return feat_lda_scaled,reductor,scaler" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "[X,reductor,scaler] = feature_scaling(feature_matrix, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this point, since the new feature matrix has two dimensions, it can be visualized in a scatter plot." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nbv/xVqxaAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(X[0:nSegments*nIterations,0],X[0:nSegments*nIterations,1],c='r',label='Closed')\n", "plt.scatter(X[nSegments*nIterations:2*nSegments*nIterations,0],X[nSegments*nIterations:2*nSegments*nIterations,1],c='b',label='Opened')\n", "plt.scatter(X[2*nSegments*nIterations:3*nSegments*nIterations,0],X[2*nSegments*nIterations:3*nSegments*nIterations,1],c='g',label='Flexion')\n", "plt.scatter(X[3*nSegments*nIterations:4*nSegments*nIterations,0],X[3*nSegments*nIterations:4*nSegments*nIterations,1],c='c',label='Extension')\n", "plt.scatter(X[4*nSegments*nIterations:5*nSegments*nIterations,0],X[4*nSegments*nIterations:5*nSegments*nIterations,1],c='m',label='Pronation')\n", "plt.legend(scatterpoints=1,loc='center left', bbox_to_anchor=(1, 0.5))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Five distinct point clusters, corresponding to the five recorded gestures, can be seen. With these data, the classifier will not have any problem in computing the decision boundaries, and probably the classification accuracy will be near a 100%." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before training the classifier, we are going to randomly divide the feature and target matrices into training and testing sets. This is done to avoid overfitting the model: by using the training set only to fit the model and the testing set to validate its performance, we ensure that the model is able to correctly classify new, completely unknown, data." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are ready to build and train our classifier. As said before, we are going to use a multiclass support vector machine (SVM). SVMs are supervised learning models that can be used for classification, regression and outliers detection. When used for classification, they can solve binary classification problems, that is, problems where there are only two classes. Despite this limitation, SVMs can be used for multiclass classification either by using one classifier per class (one-vs-all strategy) or by using one classifier per each pair of classes (one-vs-one strategy).\n", "\n", "Roughly speaking, a SVM distinguishes between data belonging to one class and data belonging to another class by constructing a linear decision surface (a hyperplane) that separates the data points (vectors) of the two classes. The hyperplane is constructed is such a way that it has the largest distance between border-line data points (support vectors). If the linear decision surface cannot be constructed because of how the data points are distributed in their dimensional space, data is mapped into a higher dimensional space (feature space) where the hyperplane can be constructed. This mapping is performed with a mathematical projection called the \"kernel trick\". In [this video](https://www.youtube.com/watch?v=3liCbRZPrZA) we can visualize this process. This explanation has been taken from [here](http://www.med.nyu.edu/chibi/sites/default/files/chibi/Final.pdf). For more information, [Wikipedia](https://en.wikipedia.org/wiki/Support_vector_machine) has a great article on SVMs.\n", "\n", "Continuing with our classification problem, we are going to use the SVM implementation of the fantastic scikit-learn library. More specifically, we are going to use a Support Vector Classifier (SVC) with a nonlinear radial basis function (RBF) kernel. This kernel has two parameters, `C` and `gamma`, that must be tuned in order to improve the performance of the classifier. The code that has been used to obtain these two values is included in the [appendix](#Appendix:-optimization-of-the-SVM-parameters-with-cross-validation).\n", "\n", "The first step is to create an instance of our classifier, setting which kernel it is going to use, and any additional parameters (in this case, the `C` and `gamma` values of the RBF kernel). With our classifier already initialized, we can train it by passing the training set to the `fit` method." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "SVC(C=10, cache_size=200, class_weight=None, coef0=0.0,\n", " decision_function_shape=None, degree=3, gamma=10, kernel='rbf',\n", " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", " tol=0.001, verbose=False)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classifier = SVC(kernel='rbf',C=10,gamma=10)\n", "classifier.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At last! We have a trained classifier that should correctly label any new incoming data. Let's see if it works. We are going to pass the first data point in the testing subset of the feature matrix (the `reshape` method is used to avoid a warning)." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 4.]\n" ] } ], "source": [ "print classifier.predict(X_test[0].reshape(1,-1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "According to the classifier, this data point corresponds to the fifth class, the pronation gesture. If it is properly trained, the first element of the testing subset of the target matrix should be this class." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n" ] } ], "source": [ "print y_test[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All right! It seems that we have implemented a classifier that is able to tell us what gesture we are performing with our hand from the myoelectric signals of the forearm.\n", "\n", "Finally, let's compute the overall accuracy of the classifier over the whole testing dataset." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Classification accuracy = 99.38 percent.\n" ] } ], "source": [ "print(\"Classification accuracy = %0.2f percent.\" %(100*classifier.score(X_test,y_test)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, the achieved classification accuracy is very high, near a perfect score." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Appendix: optimization of the SVM parameters with cross-validation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following code optimizes the classifier by finding the optimal values of the C and gamma parameters. With `StratifiedShuffleSplit`, data is divided and re-shuffled `n_iter` times into training and testing sets. This returns a cross-validation object that is passed to the `GridSearchCV` method. This method performs an exhaustive search over specified parameter values for an estimator. The `GridSearchCV` iterates over the given ranges of the `C` and `gamma` parameters and the cross-validation object, fitting the estimator in each iteration. When this process is finished, it returns the best pair of `C` and `gamma` values and the accuracy obtained by the estimator with these two values.\n", "\n", "Code taken and adapted from [here](http://scikit-learn.org/stable/auto_examples/svm/plot_rbf_parameters.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "from sklearn.cross_validation import StratifiedShuffleSplit\n", "from sklearn.grid_search import GridSearchCV\n", "\n", "C_range = np.logspace(-5,5,11)\n", "gamma_range = np.logspace(-30,1,32)\n", "param_grid = dict(gamma=gamma_range,C=C_range)\n", "cv = StratifiedShuffleSplit(y, n_iter=20,test_size=0.2,random_state=42)\n", "grid = GridSearchCV(SVC(),param_grid=param_grid,cv=cv)\n", "grid.fit(X,y)\n", "print(\"The best parameters are %s with a score of %0.2f\" % (grid.best_params_,grid.best_score_))\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] M.A. Oskoei and H. Hu, Support vector machine-based classification scheme for myoelectric control applied to\n", "upper limb. *IEEE Transactions on Biomedical Engineering*, 55(8), pp. 1956–1965, 2008.\n", "\n", "[2] E.J. Rechy-Ramirez and H. Hu, Stages for developing control systems using EMG and EEG signals: a survey, *Technical report*, School of Computer Science and Electronic Engineering, University of Essex, 2011.\n", "\n", "[3] K. Englehart, Signal representation for classification of the transient myoelectric signal, *PhD thesis*, University of New Brunswick, 1998." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11+" } }, "nbformat": 4, "nbformat_minor": 0 }