{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Baayen, R. H. and Milin, P. and Filipovic Durdevic, D. and Hendrix, P. and Marelli, M. 2011. \"An amorphous model for morphological processing in visual comprehension based on naive discriminative learning.\" *Psychological Review* 118:438-482." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas as pd\n", "import pandas.rpy.common as com\n", "import numpy as np\n", "from sklearn.feature_extraction import DictVectorizer\n", "\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "%load_ext rmagic\n", "\n", "%precision 2\n", "pd.set_option('display.precision', 3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%%R\n", "library(ndl)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "text": [ "This is ndl version 0.2.16. \n", "For an overview of the package, type 'help(\"ndl.package\")'.\n" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "data = com.load_data('plurals')\n", "data['Cues'] = [list(w) for w in data['WordForm']]\n", "data['Outcomes'] = [w.split('_') for w in data['Outcomes']]\n", "data" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WordFormFrequencyOutcomesCues
1 hand 10 [hand, NIL] [h, a, n, d]
2 hands 20 [hand, PLURAL] [h, a, n, d, s]
3 land 8 [land, NIL] [l, a, n, d]
4 lands 3 [land, PLURAL] [l, a, n, d, s]
5 and 35 [and, NIL] [a, n, d]
6 sad 18 [sad, NIL] [s, a, d]
7 as 35 [as, NIL] [a, s]
8 lad 102 [lad, NIL] [l, a, d]
9 lad 54 [lad, PLURAL] [l, a, d]
10 lass 134 [lass, NIL] [l, a, s, s]
\n", "

10 rows \u00d7 4 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ " WordForm Frequency Outcomes Cues\n", "1 hand 10 [hand, NIL] [h, a, n, d]\n", "2 hands 20 [hand, PLURAL] [h, a, n, d, s]\n", "3 land 8 [land, NIL] [l, a, n, d]\n", "4 lands 3 [land, PLURAL] [l, a, n, d, s]\n", "5 and 35 [and, NIL] [a, n, d]\n", "6 sad 18 [sad, NIL] [s, a, d]\n", "7 as 35 [as, NIL] [a, s]\n", "8 lad 102 [lad, NIL] [l, a, d]\n", "9 lad 54 [lad, PLURAL] [l, a, d]\n", "10 lass 134 [lass, NIL] [l, a, s, s]\n", "\n", "[10 rows x 4 columns]" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "Appendix\n", "========\n", "\n", "The first step is to construct the co-occurrence matrix $C$ (eq. 37), where $C_{ij}$ is the frequency with which cue $i$ co-occurs with cue $j$ ($C_{ii}$ is the marginal frequency of cue $i$)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "cues = DictVectorizer(dtype=float,sparse=False)\n", "D = cues.fit_transform({}.fromkeys(c,True) for c in data.Cues) * data.Frequency[:,np.newaxis]\n", "D " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "array([[ 10., 10., 10., 0., 10., 0.],\n", " [ 20., 20., 20., 0., 20., 20.],\n", " [ 8., 8., 0., 8., 8., 0.],\n", " [ 3., 3., 0., 3., 3., 3.],\n", " [ 35., 35., 0., 0., 35., 0.],\n", " [ 18., 18., 0., 0., 0., 18.],\n", " [ 35., 0., 0., 0., 0., 35.],\n", " [ 102., 102., 0., 102., 0., 0.],\n", " [ 54., 54., 0., 54., 0., 0.],\n", " [ 134., 0., 0., 134., 0., 134.]])" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "cues.get_feature_names()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "['a', 'd', 'h', 'l', 'n', 's']" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now sum up to get $C$:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "n = len(cues.get_feature_names())\n", "C = np.zeros((n,n))\n", "for row in D:\n", " for nz in np.nonzero(row):\n", " C[nz] += row\n", "C" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "array([[ 419., 250., 30., 301., 76., 210.],\n", " [ 250., 250., 30., 167., 76., 41.],\n", " [ 30., 30., 30., 0., 30., 20.],\n", " [ 301., 167., 0., 301., 11., 137.],\n", " [ 76., 76., 30., 11., 76., 23.],\n", " [ 210., 41., 20., 137., 23., 210.]])" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we normalize to get $C'$, the conditional probabilty matrix (eqs. 38 and 39), where: $$C'_{ij}=p(j|i)=\\frac{C_{ij}}{\\sum_kC_{ik}}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Z = C.sum(axis=1)\n", "C1 = C / Z[:,np.newaxis]\n", "C1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "array([[ 0.33, 0.19, 0.02, 0.23, 0.06, 0.16],\n", " [ 0.31, 0.31, 0.04, 0.21, 0.09, 0.05],\n", " [ 0.21, 0.21, 0.21, 0. , 0.21, 0.14],\n", " [ 0.33, 0.18, 0. , 0.33, 0.01, 0.15],\n", " [ 0.26, 0.26, 0.1 , 0.04, 0.26, 0.08],\n", " [ 0.33, 0.06, 0.03, 0.21, 0.04, 0.33]])" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, Outcome matrix $O$, where $O_{ij}$ is number of types cue $i$ occurred with outcome $j$:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "out = DictVectorizer(dtype=float,sparse=False)\n", "X = out.fit_transform([{}.fromkeys(c,True) for c in data.Outcomes]) * data.Frequency[:,np.newaxis]\n", "X" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "array([[ 10., 0., 0., 0., 10., 0., 0., 0., 0.],\n", " [ 0., 20., 0., 0., 20., 0., 0., 0., 0.],\n", " [ 8., 0., 0., 0., 0., 0., 8., 0., 0.],\n", " [ 0., 3., 0., 0., 0., 0., 3., 0., 0.],\n", " [ 35., 0., 35., 0., 0., 0., 0., 0., 0.],\n", " [ 18., 0., 0., 0., 0., 0., 0., 0., 18.],\n", " [ 35., 0., 0., 35., 0., 0., 0., 0., 0.],\n", " [ 102., 0., 0., 0., 0., 102., 0., 0., 0.],\n", " [ 0., 54., 0., 0., 0., 54., 0., 0., 0.],\n", " [ 134., 0., 0., 0., 0., 0., 0., 134., 0.]])" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "out.get_feature_names()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "['NIL', 'PLURAL', 'and', 'as', 'hand', 'lad', 'land', 'lass', 'sad']" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "O = np.zeros((len(cues.get_feature_names()),len(out.get_feature_names())))\n", "for i in xrange(len(X)):\n", " for nz in np.nonzero(D[i]):\n", " O[nz] += X[i]\n", "O" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "array([[ 342., 77., 35., 35., 30., 156., 11., 134., 18.],\n", " [ 173., 77., 35., 0., 30., 156., 11., 0., 18.],\n", " [ 10., 20., 0., 0., 30., 0., 0., 0., 0.],\n", " [ 244., 57., 0., 0., 0., 156., 11., 134., 0.],\n", " [ 53., 23., 35., 0., 30., 0., 11., 0., 0.],\n", " [ 187., 23., 0., 35., 20., 0., 3., 134., 18.]])" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As above, we renormalize $O$ to get the conditional outcome matrix $O'$, where: $$O'_{ij}=p(o_j|c_i)=\\frac{p(c_i,o_j)}{p(c_i)}=\\frac{O_{ij}}{\\sum_kC_{ik}}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "O1 = O / Z[:,np.newaxis]\n", "O1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "array([[ 0.27, 0.06, 0.03, 0.03, 0.02, 0.12, 0.01, 0.1 , 0.01],\n", " [ 0.21, 0.09, 0.04, 0. , 0.04, 0.19, 0.01, 0. , 0.02],\n", " [ 0.07, 0.14, 0. , 0. , 0.21, 0. , 0. , 0. , 0. ],\n", " [ 0.27, 0.06, 0. , 0. , 0. , 0.17, 0.01, 0.15, 0. ],\n", " [ 0.18, 0.08, 0.12, 0. , 0.1 , 0. , 0.04, 0. , 0. ],\n", " [ 0.29, 0.04, 0. , 0.05, 0.03, 0. , 0. , 0.21, 0.03]])" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we find the weight matrix *W* by solving equation (47): $C'W=O'$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.linalg.solve(C1,O1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "array([[ 1.45e+00, -4.49e-01, 3.75e-01, 1.03e+00, 2.57e-16,\n", " 4.09e-01, -3.75e-01, -3.41e-02, -4.09e-01],\n", " [ -5.31e-01, 5.31e-01, -1.62e-01, -4.44e-01, -1.98e-16,\n", " 3.95e-01, 1.62e-01, -5.56e-01, 6.05e-01],\n", " [ -4.91e-01, 4.91e-01, -6.89e-01, 5.35e-02, 1.00e+00,\n", " 3.65e-01, -3.11e-01, -5.35e-02, -3.65e-01],\n", " [ -2.23e-01, 2.23e-01, -2.15e-01, -6.20e-01, -5.38e-17,\n", " 1.65e-01, 2.15e-01, 6.20e-01, -1.65e-01],\n", " [ 8.83e-02, -8.83e-02, 6.12e-01, -4.20e-01, -4.31e-17,\n", " -8.08e-01, 3.88e-01, 4.20e-01, -1.92e-01],\n", " [ -2.72e-01, 2.72e-01, -2.05e-01, -3.35e-01, -2.03e-16,\n", " -5.41e-01, 2.05e-01, 3.35e-01, 5.41e-01]])" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, find weight matrix $W$ using the pseudoinverse $C^+$ as in equation (48): $W=C^+O'$ This has the advantage of working even when $C$ is singular." ] }, { "cell_type": "code", "collapsed": false, "input": [ "W = np.linalg.pinv(C1).dot(O1)\n", "W" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "array([[ 1.45e+00, -4.49e-01, 3.75e-01, 1.03e+00, -4.88e-15,\n", " 4.09e-01, -3.75e-01, -3.41e-02, -4.09e-01],\n", " [ -5.31e-01, 5.31e-01, -1.62e-01, -4.44e-01, 2.44e-15,\n", " 3.95e-01, 1.62e-01, -5.56e-01, 6.05e-01],\n", " [ -4.91e-01, 4.91e-01, -6.89e-01, 5.35e-02, 1.00e+00,\n", " 3.65e-01, -3.11e-01, -5.35e-02, -3.65e-01],\n", " [ -2.23e-01, 2.23e-01, -2.15e-01, -6.20e-01, 2.80e-15,\n", " 1.65e-01, 2.15e-01, 6.20e-01, -1.65e-01],\n", " [ 8.83e-02, -8.83e-02, 6.12e-01, -4.20e-01, 7.77e-16,\n", " -8.08e-01, 3.88e-01, 4.20e-01, -1.92e-01],\n", " [ -2.72e-01, 2.72e-01, -2.05e-01, -3.35e-01, 3.00e-15,\n", " -5.41e-01, 2.05e-01, 3.35e-01, 5.41e-01]])" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "pd.DataFrame(W,columns=out.get_feature_names(),index=cues.get_feature_names())" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NILPLURALandashandladlandlasssad
a 1.45-0.45 0.38 1.03-4.88e-15 0.41-0.38-0.03-0.41
d-0.53 0.53-0.16-0.44 2.44e-15 0.39 0.16-0.56 0.61
h-0.49 0.49-0.69 0.05 1.00e+00 0.36-0.31-0.05-0.36
l-0.22 0.22-0.21-0.62 2.80e-15 0.17 0.21 0.62-0.17
n 0.09-0.09 0.61-0.42 7.77e-16-0.81 0.39 0.42-0.19
s-0.27 0.27-0.21-0.34 3.00e-15-0.54 0.21 0.34 0.54
\n", "

6 rows \u00d7 9 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ " NIL PLURAL and as hand lad land lass sad\n", "a 1.45 -0.45 0.38 1.03 -4.88e-15 0.41 -0.38 -0.03 -0.41\n", "d -0.53 0.53 -0.16 -0.44 2.44e-15 0.39 0.16 -0.56 0.61\n", "h -0.49 0.49 -0.69 0.05 1.00e+00 0.36 -0.31 -0.05 -0.36\n", "l -0.22 0.22 -0.21 -0.62 2.80e-15 0.17 0.21 0.62 -0.17\n", "n 0.09 -0.09 0.61 -0.42 7.77e-16 -0.81 0.39 0.42 -0.19\n", "s -0.27 0.27 -0.21 -0.34 3.00e-15 -0.54 0.21 0.34 0.54\n", "\n", "[6 rows x 9 columns]" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute activations. Let $u$ be a vector of cues that are active for a given input. For example, for the input *hands*, we have:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "u=cues.transform([{}.fromkeys(list('hands'),True)]).T\n", "u" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "array([[ 1.],\n", " [ 1.],\n", " [ 1.],\n", " [ 0.],\n", " [ 1.],\n", " [ 1.]])" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given $u$, the activation $a_j$ of a meaning $j$ is: $$a_j=\\sum_iW_{ij}=W^Tu$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "W.T.dot(u)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "array([[ 0.24],\n", " [ 0.76],\n", " [-0.07],\n", " [-0.11],\n", " [ 1. ],\n", " [-0.18],\n", " [ 0.07],\n", " [ 0.11],\n", " [ 0.18]])" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "pd.DataFrame(W.T.dot(u),index=out.get_feature_names())" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
NIL 0.24
PLURAL 0.76
and-0.07
as-0.11
hand 1.00
lad-0.18
land 0.07
lass 0.11
sad 0.18
\n", "

9 rows \u00d7 1 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ " 0\n", "NIL 0.24\n", "PLURAL 0.76\n", "and -0.07\n", "as -0.11\n", "hand 1.00\n", "lad -0.18\n", "land 0.07\n", "lass 0.11\n", "sad 0.18\n", "\n", "[9 rows x 1 columns]" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "targets = ['hands','hand']\n", "pd.DataFrame(W.T.dot(cues.transform([{}.fromkeys(list(t),True) for t in targets]).T),index=out.get_feature_names(),columns=targets)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
handshand
NIL 0.24 0.51
PLURAL 0.76 0.49
and-0.07 0.14
as-0.11 0.22
hand 1.00 1.00
lad-0.18 0.36
land 0.07-0.14
lass 0.11-0.22
sad 0.18-0.36
\n", "

9 rows \u00d7 2 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ " hands hand\n", "NIL 0.24 0.51\n", "PLURAL 0.76 0.49\n", "and -0.07 0.14\n", "as -0.11 0.22\n", "hand 1.00 1.00\n", "lad -0.18 0.36\n", "land 0.07 -0.14\n", "lass 0.11 -0.22\n", "sad 0.18 -0.36\n", "\n", "[9 rows x 2 columns]" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "The same thing, but packaged up in a function:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from ndl import *" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "ndl(data)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NILPLURALandashandladlandlasssad
a 1.45-0.45 0.38 1.03-4.88e-15 0.41-0.38-0.03-0.41
d-0.53 0.53-0.16-0.44 2.44e-15 0.39 0.16-0.56 0.61
h-0.49 0.49-0.69 0.05 1.00e+00 0.36-0.31-0.05-0.36
l-0.22 0.22-0.21-0.62 2.80e-15 0.17 0.21 0.62-0.17
n 0.09-0.09 0.61-0.42 7.77e-16-0.81 0.39 0.42-0.19
s-0.27 0.27-0.21-0.34 3.00e-15-0.54 0.21 0.34 0.54
\n", "

6 rows \u00d7 9 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ " NIL PLURAL and as hand lad land lass sad\n", "a 1.45 -0.45 0.38 1.03 -4.88e-15 0.41 -0.38 -0.03 -0.41\n", "d -0.53 0.53 -0.16 -0.44 2.44e-15 0.39 0.16 -0.56 0.61\n", "h -0.49 0.49 -0.69 0.05 1.00e+00 0.36 -0.31 -0.05 -0.36\n", "l -0.22 0.22 -0.21 -0.62 2.80e-15 0.17 0.21 0.62 -0.17\n", "n 0.09 -0.09 0.61 -0.42 7.77e-16 -0.81 0.39 0.42 -0.19\n", "s -0.27 0.27 -0.21 -0.34 3.00e-15 -0.54 0.21 0.34 0.54\n", "\n", "[6 rows x 9 columns]" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }