{ "nbformat_minor": 0, "nbformat": 4, "cells": [ { "execution_count": null, "cell_type": "code", "source": [ "%matplotlib inline" ], "outputs": [], "metadata": { "collapsed": false } }, { "source": [ "\n====================================================================\nDecoding in sensor space data using the Common Spatial Pattern (CSP)\n====================================================================\n\nDecoding applied to MEG data in sensor space decomposed using CSP.\nHere the classifier is applied to features extracted on CSP filtered signals.\n\nSee http://en.wikipedia.org/wiki/Common_spatial_pattern and [1]_.\n\nReferences\n----------\n\n.. [1] Zoltan J. Koles. The quantitative extraction and topographic mapping\n of the abnormal components in the clinical EEG. Electroencephalography\n and Clinical Neurophysiology, 79(6):440--447, December 1991.\n\n" ], "cell_type": "markdown", "metadata": {} }, { "execution_count": null, "cell_type": "code", "source": [ "# Authors: Alexandre Gramfort \n# Romain Trachel \n#\n# License: BSD (3-clause)\n\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimport mne\nfrom mne import io\nfrom mne.datasets import sample\n\nprint(__doc__)\n\ndata_path = sample.data_path()" ], "outputs": [], "metadata": { "collapsed": false } }, { "source": [ "Set parameters and read data\n\n" ], "cell_type": "markdown", "metadata": {} }, { "execution_count": null, "cell_type": "code", "source": [ "raw_fname = data_path + '/MEG/sample/sample_audvis_filt-0-40_raw.fif'\nevent_fname = data_path + '/MEG/sample/sample_audvis_filt-0-40_raw-eve.fif'\ntmin, tmax = -0.2, 0.5\nevent_id = dict(aud_l=1, vis_l=3)\n\n# Setup for reading the raw data\nraw = io.read_raw_fif(raw_fname, preload=True)\nraw.filter(2, None) # replace baselining with high-pass\nevents = mne.read_events(event_fname)\n\nraw.info['bads'] = ['MEG 2443'] # set bad channels\npicks = mne.pick_types(raw.info, meg='grad', eeg=False, stim=False, eog=False,\n exclude='bads')\n\n# Read epochs\nepochs = mne.Epochs(raw, events, event_id, tmin, tmax, proj=True,\n picks=picks, baseline=None, preload=True)\n\nlabels = epochs.events[:, -1]\nevoked = epochs.average()" ], "outputs": [], "metadata": { "collapsed": false } }, { "source": [ "Decoding in sensor space using a linear SVM\n\n" ], "cell_type": "markdown", "metadata": {} }, { "execution_count": null, "cell_type": "code", "source": [ "from sklearn.svm import SVC # noqa\nfrom sklearn.cross_validation import ShuffleSplit # noqa\nfrom mne.decoding import CSP # noqa\n\nn_components = 3 # pick some components\nsvc = SVC(C=1, kernel='linear')\ncsp = CSP(n_components=n_components)\n\n# Define a monte-carlo cross-validation generator (reduce variance):\ncv = ShuffleSplit(len(labels), 10, test_size=0.2, random_state=42)\nscores = []\nepochs_data = epochs.get_data()\n\nfor train_idx, test_idx in cv:\n y_train, y_test = labels[train_idx], labels[test_idx]\n\n X_train = csp.fit_transform(epochs_data[train_idx], y_train)\n X_test = csp.transform(epochs_data[test_idx])\n\n # fit classifier\n svc.fit(X_train, y_train)\n\n scores.append(svc.score(X_test, y_test))\n\n# Printing the results\nclass_balance = np.mean(labels == labels[0])\nclass_balance = max(class_balance, 1. - class_balance)\nprint(\"Classification accuracy: %f / Chance level: %f\" % (np.mean(scores),\n class_balance))\n\n# Or use much more convenient scikit-learn cross_val_score function using\n# a Pipeline\nfrom sklearn.pipeline import Pipeline # noqa\nfrom sklearn.cross_validation import cross_val_score # noqa\ncv = ShuffleSplit(len(labels), 10, test_size=0.2, random_state=42)\nclf = Pipeline([('CSP', csp), ('SVC', svc)])\nscores = cross_val_score(clf, epochs_data, labels, cv=cv, n_jobs=1)\nprint(scores.mean()) # should match results above\n\n# And using reuglarized csp with Ledoit-Wolf estimator\ncsp = CSP(n_components=n_components, reg='ledoit_wolf')\nclf = Pipeline([('CSP', csp), ('SVC', svc)])\nscores = cross_val_score(clf, epochs_data, labels, cv=cv, n_jobs=1)\nprint(scores.mean()) # should get better results than above\n\n# plot CSP patterns estimated on full data for visualization\ncsp.fit_transform(epochs_data, labels)\ndata = csp.patterns_\nfig, axes = plt.subplots(1, 4)\nfor idx in range(4):\n mne.viz.plot_topomap(data[idx], evoked.info, axes=axes[idx], show=False)\nfig.suptitle('CSP patterns')\nfig.tight_layout()\nfig.show()" ], "outputs": [], "metadata": { "collapsed": false } } ], "metadata": { "kernelspec": { "display_name": "Python 2", "name": "python2", "language": "python" }, "language_info": { "mimetype": "text/x-python", "nbconvert_exporter": "python", "name": "python", "file_extension": ".py", "version": "2.7.13", "pygments_lexer": "ipython2", "codemirror_mode": { "version": 2, "name": "ipython" } } } }