{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Modéle linéaire: statsmodels, sklearn et sympy\n", "\n", "***\n", "> __Auteur__: Joseph Salmon\n", "> " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Statsmodels et moindre carrés\n", "ATTENTION: pour utiliser la syntaxe de type \"R\" en statsmodel, il faut patsy version > '0.5.1'\n", "ce que l'on peut tester avec " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'0.5.1'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import patsy\n", "patsy.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Utiliser 'pip install download' (en ligne de commande) si besoin sur votre machine\n", "from download import download\n", "\n", "import numpy as np\n", "from sklearn import linear_model\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import statsmodels.api as sm\n", "import statsmodels.formula.api as smf" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Replace is False and data exists, so doing nothing. Use replace==True to re-download the data.\n" ] }, { "data": { "text/plain": [ "'./arbres.txt'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = \"http://josephsalmon.eu/enseignement/datasets/arbres.txt\"\n", "path_target = \"./arbres.txt\"\n", "download(url, path_target, replace=False)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df_arbres = pd.read_csv(\"arbres.txt\",sep=' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aide disponible ici pour le package statsmodels (avec la syntaxe de R):\n", "http://www.statsmodels.org/devel/example_formulas.html" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/jo/anaconda3/lib/python3.6/site-packages/scipy/stats/stats.py:1394: UserWarning: kurtosistest only valid for n>=20 ... continuing anyway, n=10\n", " \"anyway, n=%i\" % int(n))\n" ] }, { "data": { "text/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", "
OLS Regression Results
Dep. Variable: vol R-squared: 0.970
Model: OLS Adj. R-squared: 0.966
Method: Least Squares F-statistic: 257.2
Date: Thu, 18 Apr 2019 Prob (F-statistic): 2.29e-07
Time: 10:31:47 Log-Likelihood: 27.418
No. Observations: 10 AIC: -50.84
Df Residuals: 8 BIC: -50.23
Df Model: 1
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 0.0052 0.017 0.305 0.768 -0.034 0.045
aire 0.0005 3.06e-05 16.039 0.000 0.000 0.001
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 0.402 Durbin-Watson: 2.424
Prob(Omnibus): 0.818 Jarque-Bera (JB): 0.331
Skew: -0.343 Prob(JB): 0.847
Kurtosis: 2.431 Cond. No. 1.75e+03


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.75e+03. This might indicate that there are
strong multicollinearity or other numerical problems." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: vol R-squared: 0.970\n", "Model: OLS Adj. R-squared: 0.966\n", "Method: Least Squares F-statistic: 257.2\n", "Date: Thu, 18 Apr 2019 Prob (F-statistic): 2.29e-07\n", "Time: 10:31:47 Log-Likelihood: 27.418\n", "No. Observations: 10 AIC: -50.84\n", "Df Residuals: 8 BIC: -50.23\n", "Df Model: 1 \n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 0.0052 0.017 0.305 0.768 -0.034 0.045\n", "aire 0.0005 3.06e-05 16.039 0.000 0.000 0.001\n", "==============================================================================\n", "Omnibus: 0.402 Durbin-Watson: 2.424\n", "Prob(Omnibus): 0.818 Jarque-Bera (JB): 0.331\n", "Skew: -0.343 Prob(JB): 0.847\n", "Kurtosis: 2.431 Cond. No. 1.75e+03\n", "==============================================================================\n", "\n", "Warnings:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "[2] The condition number is large, 1.75e+03. This might indicate that there are\n", "strong multicollinearity or other numerical problems.\n", "\"\"\"" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = smf.ols('vol ~ aire', data=df_arbres).fit()\n", "results.summary()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Intercept 0.005233\n", "aire 0.000491\n", "dtype: float64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.params" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 18.36734694, 36.73469388, 55.10204082,\n", " 73.46938776, 91.83673469, 110.20408163, 128.57142857,\n", " 146.93877551, 165.30612245, 183.67346939, 202.04081633,\n", " 220.40816327, 238.7755102 , 257.14285714, 275.51020408,\n", " 293.87755102, 312.24489796, 330.6122449 , 348.97959184,\n", " 367.34693878, 385.71428571, 404.08163265, 422.44897959,\n", " 440.81632653, 459.18367347, 477.55102041, 495.91836735,\n", " 514.28571429, 532.65306122, 551.02040816, 569.3877551 ,\n", " 587.75510204, 606.12244898, 624.48979592, 642.85714286,\n", " 661.2244898 , 679.59183673, 697.95918367, 716.32653061,\n", " 734.69387755, 753.06122449, 771.42857143, 789.79591837,\n", " 808.16326531, 826.53061224, 844.89795918, 863.26530612,\n", " 881.63265306, 900. ])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xlim = [0, 900]\n", "ylim = [0, 0.5]\n", "X_pred = np.linspace(0,900,num=50)\n", "X_pred" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prétraitement pour utiliser `statsmodels`" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Utile pour l'affichage: on trie dans l'ordre croissant les observations (tester l'affichage sans!)\n", "df_arbres.sort_values(by=['aire'], inplace=True)\n", "# Obligatoire pour gerer la constante:\n", "X = sm.add_constant(df_arbres['aire'])\n", "X_pred_sm = sm.add_constant(X_pred)\n", "# Besoin de créer un dataframe pour garder la structure\n", "df_to_predic = pd.DataFrame(X_pred_sm)\n", "df_to_predic.columns = ['Intercept', 'aire']" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , 0. ],\n", " [ 1. , 18.36734694],\n", " [ 1. , 36.73469388],\n", " [ 1. , 55.10204082],\n", " [ 1. , 73.46938776],\n", " [ 1. , 91.83673469],\n", " [ 1. , 110.20408163],\n", " [ 1. , 128.57142857],\n", " [ 1. , 146.93877551],\n", " [ 1. , 165.30612245],\n", " [ 1. , 183.67346939],\n", " [ 1. , 202.04081633],\n", " [ 1. , 220.40816327],\n", " [ 1. , 238.7755102 ],\n", " [ 1. , 257.14285714],\n", " [ 1. , 275.51020408],\n", " [ 1. , 293.87755102],\n", " [ 1. , 312.24489796],\n", " [ 1. , 330.6122449 ],\n", " [ 1. , 348.97959184],\n", " [ 1. , 367.34693878],\n", " [ 1. , 385.71428571],\n", " [ 1. , 404.08163265],\n", " [ 1. , 422.44897959],\n", " [ 1. , 440.81632653],\n", " [ 1. , 459.18367347],\n", " [ 1. , 477.55102041],\n", " [ 1. , 495.91836735],\n", " [ 1. , 514.28571429],\n", " [ 1. , 532.65306122],\n", " [ 1. , 551.02040816],\n", " [ 1. , 569.3877551 ],\n", " [ 1. , 587.75510204],\n", " [ 1. , 606.12244898],\n", " [ 1. , 624.48979592],\n", " [ 1. , 642.85714286],\n", " [ 1. , 661.2244898 ],\n", " [ 1. , 679.59183673],\n", " [ 1. , 697.95918367],\n", " [ 1. , 716.32653061],\n", " [ 1. , 734.69387755],\n", " [ 1. , 753.06122449],\n", " [ 1. , 771.42857143],\n", " [ 1. , 789.79591837],\n", " [ 1. , 808.16326531],\n", " [ 1. , 826.53061224],\n", " [ 1. , 844.89795918],\n", " [ 1. , 863.26530612],\n", " [ 1. , 881.63265306],\n", " [ 1. , 900. ]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_pred_sm" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.figure(figsize=(8, 6))\n", "plt.scatter(df_arbres['aire'], df_arbres['vol'], label='Données')\n", "plt.xlabel('Aire')\n", "plt.ylabel('Volume')\n", "plt.xlim([0, 900])\n", "plt.ylim([0, 0.5])\n", "plt.plot(X_pred_skl, skl_linmod.predict(X_pred_skl), '--', label='OLS')\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Anova et calcul symbolique: forme de la matrice $(X^\\top X)^{-1}$" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sympy as sym" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFUAAAAyBAMAAADfKoqLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUIhAyRKt2mbvdzWbjN+QHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABkElEQVRIDe2WPUvDQByHf3lrqrUvKAi6mNHBQr+AtGAEndpv0IIfwKCro5Nv1FGniosWhK7ioh9AzOyiILhafKt0sCZtrve/csh1E+pByN0vzx25u+ThMNd5hULRO50MptxlBRSWu5TBtAoZMrGRYDe2V4+rA0siZnwdnKuq9T7ARtniV30vQ9YslruF+SmyLBsLQJ+wltVCqimyLIs3AIewMJqIB52FEmVa1YZH2XEf6ceSgCLKyl4izPncNAf5khNmvGi9LF+fDTPOFj1kU5Uw4yXKstgMM85uAStPHOvWouwe3a+WswMYbb71GipsLNoiFXahnesOrMKy1/ln1fdidNbMnnePztl0yV3mEj1xiXIBxsPO2Q1BIXPJ2oSPYgU4BJKElbqkVPbwEkC7gE5YuUvywH4AzcCzCcv8IrrkAvi2EGiqQVG5SyZhfOgw2ic1gdUkLjFb0P3n4LJ7fyHrIHOJfQ3zIIdkzRSF9otL0uKobHTIXLJe6D+mFZlL9LtTivTrf8wlw5wJhjhr/AAM5ngZNV4VrQAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left[\\begin{matrix}n & n_{F}\\\\n_{F} & n_{F}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ n n_F⎤\n", "⎢ ⎥\n", "⎣n_F n_F⎦" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.init_printing()\n", "\n", "nF, nM, n = sym.symbols('n_F n_M n')\n", "matrix = sym.Matrix([[n, nF],\n", " [nF, nF]])\n", "matrix" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAA/CAMAAAA2e8/eAAAANlBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHL6OuAAAAEXRSTlMARM1UEGaZMnbvIt2ribvB7b+PrOIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAP9SURBVGgF7ZvrtuoqDIWprb2odR/f/2UP4BLnpKTlUt1lj9UfSgIJ+aQX0gxV8zDHSf3Lx90ytqp5tPpovoc63HedK8ZdYxAfhnXXqbecDX1/3RqT0J/gbvo6q1LNnqwJ7n5ZvXPo3J+Hcew9bbZ46HU9N9NZqeli6PrHPM/3orv2kVkv3WiusEdnWJ+BFq3xkVmVuo0acjKoarwp1Sm9zHFHqy3949is06BP3lnpT3Uf1dD60ctydawX8wS+Nq1hnW7z88KV+bAnxNru+8yJdhf1zGn0eavG2Zy4Bjv6BNbjl6yX/vow18ROR4K7KFYIq028Ay9ZwdmXm4ms7emasqqhdf0yIExHrDYZKP14OZ9P5rhO9stcBPYA7y+V+N1Z058Pc69QYB3R9B0Tq9dp9w6ebk204XgDKjmHZy/sTTGUF9bBektdVv0IXppUwTokL6veT7nL0p0DVbDeQlefQxAap8XCHpcVkrfn3gYUiCeo1bh4IC1YJVN0L7cFa0Ht+eH78Dt5u/ywQjYHlu9xnOS1i5O4s8mRYArqyCZODCaolpNOYoXkrbHvv0ABnhWpMcl7WuFQv02mfuemLFiTGuNhh8QKyZvdAuuhLptr7q/DrJRTc5I3ROwgwZRDiZKcdVQ87NJjdcnb60WkU3hm+s4VSPJevxAPZknwyINESbAGtZx0Mus7eeue1+tbQbOjGpO88/aDCk3JZ5QgWKMa42GfzArJ2/X5xuWdzaEdjDPTuLtvv/1GHUzRY2RbsAY1xcNemRX6xsiXD5TkRVyuMMVHmhQPzyCyqrhCBCV5rVtgnuSLEsXjzSuzNqmBD3+K3i56gX1AlFlVu9jwrc2v6yr/+fuGtfF/oW+FNTWanV+Fpk6/Pf6Xdfs3Coz46rrG7fY5ylrXFXf7TCRLlbLSbl+m455KWSn7YCJZqpYVdvsyHffsyBpdV+EI8iTc7cd62I01oa4SG9vaONjtrw2jvt1YyesxhV9WWpdlWYW66xGy1jWibgRDkn8MsN2n+RNBFmty9LsZJKVeelZ6oV8X6/brLO9XpXJaVayF5bSaWEvLaTWxlpbT8liF7FFQe9fQtij4KS2nZbKmlbS26XgEJqfvUlRxOS2LVcgeSS2XkJgrIAl+istpWayQPWaUkAJ0vspVqLA0Zrf7eqTrjJobymmZrEL2CGq5hOSDBeSgn+JyWh6rkD2iWi4hBdg8VdhPcTktj1XIHkFtwk0tHDhiwU9pOS2P1UUlNlZKSKJNqAP9lJbTPsS6VkIKIUk69lNYTvsQqxR7mT65nKY6LKdVxZpYTtM/7IjltLpYy04Ly2qy/wOUxMtIVq1f/x3szP/qKKldNauy0/53sO3+B4S4N955ArQBAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{n_{F}}{n \\left(n - n_{F}\\right)} + \\frac{1}{n} & - \\frac{1}{n - n_{F}}\\\\- \\frac{1}{n - n_{F}} & \\frac{n}{n_{F} \\left(n - n_{F}\\right)}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ n_F 1 -1 ⎤\n", "⎢─────────── + ─ ─────── ⎥\n", "⎢n⋅(n - n_F) n n - n_F ⎥\n", "⎢ ⎥\n", "⎢ -1 n ⎥\n", "⎢ ─────── ─────────────⎥\n", "⎣ n - n_F n_F⋅(n - n_F)⎦" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol=matrix.inv()\n", "sol" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALkAAAA5BAMAAACYM5e3AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUIhAyu5ndRKt2Zs1x/fYDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC8ElEQVRYCe1YP2gTYRR/8f40XpM2oHQRMXZxEhxEcLAEbMGt2RUJOujg0EVcRII42EHM0kUQWxxKcQkOTh2CLooOmUScMgkuJRScHM7v313e9+flrslZUfyW+77f+/1+9+4lvHscgL1u2VAmEq5lUiTh9npOIqKFjzvoNHa7MzbqDkZ/wv1UvG9mU0zuR+K4BseWV36Pe7B8uQYLpjdAMbkDhP+c+0W7WJmI5/hHOitz5cVupplJ8Nd/9kyMqLtFmxBw5j6hly2b0P36Hl/fbD8dQe7zsXMNdYFxckriWLGQu6Er4vjfnari4VXmy+dPbZVF9cmd91RCGo6JSK84OPevJ+F44r7VLzWgvL/4QPOyD1VBlLjUP108M0h4yN2/1oEfCl/5APNNYK/KckIkrpIogkrP3g3thIzcYbYX1WD7HltN2IUtgEo3qCZE6sqJEdfclXr4CM1+QsbupVa53lKBBXgYwkzvZsIjr4Ioo1J/PzyXkrH7Khx92ZIRfwjPLkDpdfI7pHxzI4kSlfoTpxspCbu/gspZFYi68LYPq5A+YyowNpIoQaH3h6iY2F0XssltSUdynbwBopHubHLzvmemjpzUduk5wkh3/necev0F7nYLUE9dSO6ohejFLMIdt5Di3VUL0I3FqYjcAbcQ7R60u2ty06SjA2ohI5DvSHfn5KZr0xNqISkmNqS7TpvwdBjugRjc9lqQZx4jxi8LHo6pe85a+AQvFPi0lakT7t4mD0zpPtvgJq71iINTut9wGQvsagHub0j3uQYLmbmjZorHLGyCcfaGIRQV/l4z3VEzlWOWPY8h3GfuhMLr2u64mVLzGMKjNaAULGTnnmceG81pbN6gJrhw4HDHzZSax0Y4/55EKPiNrbqjZkrNYwgPOsBGKucEV61Ld+0LCmqmcsyy5zGMbwAQivImiC8ojq8/7LbJouYxib9LaOgqI3MA4usPCthbah5T+AypuGRHDoxEfUIStInAgeDzBLvSlIFfgy5Qy5m0/XYAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{1}{n - n_{F}} & - \\frac{1}{n - n_{F}}\\\\- \\frac{1}{n - n_{F}} & \\frac{n}{n_{F} \\left(n - n_{F}\\right)}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 1 -1 ⎤\n", "⎢─────── ─────── ⎥\n", "⎢n - n_F n - n_F ⎥\n", "⎢ ⎥\n", "⎢ -1 n ⎥\n", "⎢─────── ─────────────⎥\n", "⎣n - n_F n_F⋅(n - n_F)⎦" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol=sym.simplify(sol)\n", "sol" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIQAAAA3CAMAAAD6xBJOAAAAPFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMA74lUIhAyu5ndRKt2Zs3lXPnpnAfHPAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAnRJREFUWAntWet6gyAMDRdREbuL7/+uA2+NNQlUu63fVv4UQ3I4RiGcCiA0VwuDdw8dQnNN0949ExtwGM0/kATAQbSDYUw2BDQ1xKbpOCGMDhCtFJpOsytQxlpb0dFUGO1ZYqXQqji5iSQcD0CF8d65EQ7NvUjMqctkwjx0iXJoIgnbtEMXck+6dJxHE0mUwp/1+5MkqgtqwtrfJI/IRNrC6LaJLL2goZJ1RSBIrGM/1nmRWFL9yoSUib7pXQjN4nL2Nw9HPY7eqx5A2TS7HmIXwKpuvEz9e1sejiBhq5DK1jCec2wzZqRX9069+hfAESQAUtHy07S9u0Q4488c/bNwJIl01mo0pF03QCRjXWDOoOv9Sp0sHEXCpg219WYiUTsw0HlpFnksD0eR8F1EDTq9kVUPuvcVKOYgLE8/jebhKBII2TvwtYfq7cw7ccVb4G7OazIJ0zZQdfD+9vF5RTrem+FcrcwGRCaxunKH9dXhVOefkMjv2vD9mcC7NvPQvp3EZtf+LRKbIvB7JNCufY4EJ+AYVGzGuza2o37RO8ELOITEddGuzbkUkeCCH2V/LhJ7/VYgnXap4GPokQnguTKxu6kfNLwysST76TNRUISXe1l/6RjaugZJmcBFuFSJ4Zhm0FrXSbdgK4EkkNgU4UIltomZzoRRwW2sBJJAYlOEi5UYklshSocKRi2LrASSSAIV4WIlhmLqAG4+ViMrgSSRwEU4QJkSwzGq05O0B2wlkBIJ7lMDKsLFSgzFpJnHZxHVNa/plk8NqbZkBC8jndZFRnVMWhe7dos0f3TZ+e0NnHTae14t5tLOebja4p8Mk6a7FWFfNw8glFWEZ10AAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{1}{n_{M}} & - \\frac{1}{n_{M}}\\\\- \\frac{1}{n_{M}} & \\frac{n}{n_{F} n_{M}}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 1 -1 ⎤\n", "⎢─── ─── ⎥\n", "⎢n_M n_M ⎥\n", "⎢ ⎥\n", "⎢-1 n ⎥\n", "⎢─── ───────⎥\n", "⎣n_M n_F⋅n_M⎦" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_sol = sol.subs(n - nF, nM)\n", "new_sol" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAA3CAMAAABXRQrnAAAAPFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMA74lUIhAyu5ndRKt2Zs3lXPnpnAfHPAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAoJJREFUaAXtmdl6gyAQhYdVRe3m+79rGYmWfg44ENJVLhoaPIffMRo4Acg12+VG7xxrYm77friTIy1vZu4exwjQyLyRDV1NvrlYfJO0S6tTpd0ZjBLhBAiltTa0y7czGs+mPKNN8OHbjFPNqE+GmOb2YswXslEd1SOfPUzz/LXW/bCMU74Y1aNs8zxj9fxNhRcjgHmKWu4hl6k8VUd8tNMtY8Qeop3x3ZQFxZg69rvevxjbVP6q4wPrOPeznaa+zQwHl2J38lrPTswAQqO9XHwXQItx/Rf7d7Zid4pRmwlXEsu67tX9Ws9Z3Em2y8vdKUYAXEe4QDXbJ2+vXMM9bKk7zYhL814CfndN4Fm1nVIbnr0+/E6pO8mo8WtpcCowdhYUjI7PcHJksTvJ6EY/zSTxZjEzyNkZEKlN2QkQMVzsTjJGxs6C6xyY5/LPIyMp2dyjxT6hOmFUQw9mhJfn17cInNPlJCU3d9sJdbMkVSeMOw1ze7Qf7zsVElp1McZlZfaJ6l91ZNYuPuzn1FElN+1/nJEZe8RXLSdJ15FQ8e4ZduzxwZiXpBhJFY/xY+pGvRQjaf+7GI+pR3miAOcSuWYrg1hfcH0VWkK4Dv6uOm5n9CWvf/jz+CX12yb5X3UsThQAmJJjHTPC7H1dnCh4Rl7EYQ5buFjYL1LKDvf1a8sxlicKUCEJHJ+EYe2z5005xqq8ojSEuNXq01yTf7YbWHMmHM4zliYK3rBCEjAjYTeB3XaKZ4zFiYJPXWojjlgoRhlCu0CPdUz+NlycKPgNa23EEQkRd7vQ22/D+H1+FjkRiUI4yfTfCkkwU/sdjfGnb7xc8ZgopNluIxWSDXHYqrhN8g7bVyK8Z550swAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{1}{n_{M}} & - \\frac{1}{n_{M}}\\\\- \\frac{1}{n_{M}} & \\frac{1}{n_{M}} + \\frac{1}{n_{F}}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 1 -1 ⎤\n", "⎢─── ─── ⎥\n", "⎢n_M n_M ⎥\n", "⎢ ⎥\n", "⎢-1 1 1 ⎥\n", "⎢─── ─── + ───⎥\n", "⎣n_M n_M n_F⎦" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_sol = sol.subs(n, nM + nF)\n", "XTXinv = new_sol.expand()\n", "XTXinv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cas muli-modalités de l'anova:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left[\\begin{matrix}n & n_{1} & n_{2} & n_{3} & n_{4}\\\\n_{1} & n_{1} & 0 & 0 & 0\\\\n_{2} & 0 & n_{2} & 0 & 0\\\\n_{3} & 0 & 0 & n_{3} & 0\\\\n_{4} & 0 & 0 & 0 & n_{4}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡n n₁ n₂ n₃ n₄⎤\n", "⎢ ⎥\n", "⎢n₁ n₁ 0 0 0 ⎥\n", "⎢ ⎥\n", "⎢n₂ 0 n₂ 0 0 ⎥\n", "⎢ ⎥\n", "⎢n₃ 0 0 n₃ 0 ⎥\n", "⎢ ⎥\n", "⎣n₄ 0 0 0 n₄⎦" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n0, n1, n2, n3, n4, n = sym.symbols('n0 n1 n2 n3 n4 n')\n", "matrix4 = sym.Matrix([[n, n1, n2, n3, n4],\n", " [n1, n1, 0, 0, 0],\n", " [n2, 0, n2, 0, 0],\n", " [n3, 0, 0, n3, 0],\n", " [n4, 0, 0, 0, n4]]\n", " )\n", "matrix4" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}}\\\\\\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{n - n_{2} - n_{3} - n_{4}}{n_{1} \\left(n - n_{1} - n_{2} - n_{3} - n_{4}\\right)} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}}\\\\\\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{n - n_{1} - n_{3} - n_{4}}{n_{2} \\left(n - n_{1} - n_{2} - n_{3} - n_{4}\\right)} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}}\\\\\\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{n - n_{1} - n_{2} - n_{4}}{n_{3} \\left(n - n_{1} - n_{2} - n_{3} - n_{4}\\right)} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}}\\\\\\frac{1}{- n + n_{1} + n_{2} + n_{3} + n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{1}{n - n_{1} - n_{2} - n_{3} - n_{4}} & \\frac{- n + n_{1} + n_{2} + n_{3}}{n_{4} \\left(- n + n_{1} + n_{2} + n_{3} + n_{4}\\right)}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ 1 1 1 \n", "⎢───────────────────── ────────────────────── ────────────────────── \n", "⎢n - n₁ - n₂ - n₃ - n₄ -n + n₁ + n₂ + n₃ + n₄ -n + n₁ + n₂ + n₃ + n₄ \n", "⎢ \n", "⎢ 1 n - n₂ - n₃ - n₄ 1 \n", "⎢────────────────────── ────────────────────────── ───────────────────── \n", "⎢-n + n₁ + n₂ + n₃ + n₄ n₁⋅(n - n₁ - n₂ - n₃ - n₄) n - n₁ - n₂ - n₃ - n₄ \n", "⎢ \n", "⎢ 1 1 n - n₁ - n₃ - n₄ \n", "⎢────────────────────── ───────────────────── ─────────────────────────\n", "⎢-n + n₁ + n₂ + n₃ + n₄ n - n₁ - n₂ - n₃ - n₄ n₂⋅(n - n₁ - n₂ - n₃ - n₄\n", "⎢ \n", "⎢ 1 1 1 \n", "⎢────────────────────── ───────────────────── ───────────────────── \n", "⎢-n + n₁ + n₂ + n₃ + n₄ n - n₁ - n₂ - n₃ - n₄ n - n₁ - n₂ - n₃ - n₄ \n", "⎢ \n", "⎢ 1 1 1 \n", "⎢────────────────────── ───────────────────── ───────────────────── \n", "⎣-n + n₁ + n₂ + n₃ + n₄ n - n₁ - n₂ - n₃ - n₄ n - n₁ - n₂ - n₃ - n₄ \n", "\n", " 1 1 ⎤\n", " ────────────────────── ────────────────────── ⎥\n", " -n + n₁ + n₂ + n₃ + n₄ -n + n₁ + n₂ + n₃ + n₄ ⎥\n", " ⎥\n", " 1 1 ⎥\n", " ───────────────────── ───────────────────── ⎥\n", " n - n₁ - n₂ - n₃ - n₄ n - n₁ - n₂ - n₃ - n₄ ⎥\n", " ⎥\n", " 1 1 ⎥\n", "─ ───────────────────── ───────────────────── ⎥\n", ") n - n₁ - n₂ - n₃ - n₄ n - n₁ - n₂ - n₃ - n₄ ⎥\n", " ⎥\n", " n - n₁ - n₂ - n₄ 1 ⎥\n", " ────────────────────────── ───────────────────── ⎥\n", " n₃⋅(n - n₁ - n₂ - n₃ - n₄) n - n₁ - n₂ - n₃ - n₄ ⎥\n", " ⎥\n", " 1 -n + n₁ + n₂ + n₃ ⎥\n", " ───────────────────── ───────────────────────────⎥\n", " n - n₁ - n₂ - n₃ - n₄ n₄⋅(-n + n₁ + n₂ + n₃ + n₄)⎦" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol4 = sym.simplify(matrix4.inv())\n", "sol4" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left[\\begin{matrix}\\frac{1}{n_{0}} & - \\frac{1}{n_{0}} & - \\frac{1}{n_{0}} & - \\frac{1}{n_{0}} & - \\frac{1}{n_{0}}\\\\- \\frac{1}{n_{0}} & \\frac{1}{n_{1}} + \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}}\\\\- \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{2}} + \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}}\\\\- \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{3}} + \\frac{1}{n_{0}} & \\frac{1}{n_{0}}\\\\- \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{0}} & \\frac{1}{n_{4}} + \\frac{1}{n_{0}}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡1 -1 -1 -1 -1 ⎤\n", "⎢── ─── ─── ─── ─── ⎥\n", "⎢n₀ n₀ n₀ n₀ n₀ ⎥\n", "⎢ ⎥\n", "⎢-1 1 1 1 1 1 ⎥\n", "⎢─── ── + ── ── ── ── ⎥\n", "⎢ n₀ n₁ n₀ n₀ n₀ n₀ ⎥\n", "⎢ ⎥\n", "⎢-1 1 1 1 1 1 ⎥\n", "⎢─── ── ── + ── ── ── ⎥\n", "⎢ n₀ n₀ n₂ n₀ n₀ n₀ ⎥\n", "⎢ ⎥\n", "⎢-1 1 1 1 1 1 ⎥\n", "⎢─── ── ── ── + ── ── ⎥\n", "⎢ n₀ n₀ n₀ n₃ n₀ n₀ ⎥\n", "⎢ ⎥\n", "⎢-1 1 1 1 1 1 ⎥\n", "⎢─── ── ── ── ── + ──⎥\n", "⎣ n₀ n₀ n₀ n₀ n₄ n₀⎦" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_sol4 = sol4.subs(n, n0 + n1 + n2 + n3 + n4)\n", "new_sol4.expand()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }