{"id":8016,"date":"2022-08-03T10:49:43","date_gmt":"2022-08-03T15:49:43","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=8016"},"modified":"2026-01-09T06:41:58","modified_gmt":"2026-01-09T11:41:58","slug":"minimos-cuadrados-con-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u08\/minimos-cuadrados-con-python\/","title":{"rendered":"8.2 Regresi\u00f3n por M\u00ednimos cuadrados con Python"},"content":{"rendered":"\n<p><em><strong>Referencia<\/strong><\/em>: Chapra 17.1.2 p 469. Burden 8.1 p499<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Criterio de ajuste a una l\u00ednea recta por m\u00ednimos cuadrados<\/h3>\n\n\n\n<p>Una aproximaci\u00f3n de la relaci\u00f3n entre los puntos x<sub>i<\/sub>, y<sub>i<\/sub> por medio de un polinomio de grado 1, busca minimizar la suma de los errores residuales de los datos.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_{i,modelo} = p_1(x) = a_0 + a_1 x_i <\/span>\n\n\n\n<p>Se busca el valor m\u00ednimo para los cuadrados de las diferencias entre los valores de y<sub>i<\/sub> con la l\u00ednea recta.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"546\" height=\"440\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2022\/08\/MinimosCuadrados_02.png\" alt=\"M\u00ednimos Cuadrados 02\" class=\"wp-image-13923\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> S_r = \\sum_{i=1}^{n} \\Big( y_{i,medida} - y_{i,modelo} \\Big)^2<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> S_r= \\sum_{i=1}^{n} \\Big( y_{i} - (a_0 + a_1 x_i) \\Big)^2<\/span>\n\n\n\n<p>para que el error acumulado sea m\u00ednimo, se deriva respecto a los coeficientes de la recta a<sub>0<\/sub> y a<sub>1<\/sub> y se iguala a cero,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{\\partial S_r}{\\partial a_0}= (-1)2 \\sum_{i=1}^{n} \\Big( y_{i} - a_0 - a_1 x_i \\Big)<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{\\partial S_r}{\\partial a_1}= (-1)2 \\sum_{i=1}^{n} \\Big( y_{i} - a_0 - a_1 x_i \\Big)x_i<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 0 = \\sum_{i=1}^{n} y_i - \\sum_{i=1}^{n} a_0 - \\sum_{i=1}^{n} a_1 x_i<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 0= \\sum_{i=1}^{n} y_i x_i - \\sum_{i=1}^{n} a_0x_i - \\sum_{i=1}^{n} a_1 x_i^2 <\/span>\n\n\n\n<p>simplificando,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\sum_{i=1}^{n} a_0 + a_1 \\sum_{i=1}^{n} x_i = \\sum_{i=1}^{n} y_{i}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 \\sum_{i=1}^{n} x_i + a_1 \\sum_{i=1}^{n} x_i^2 = \\sum_{i=1}^{n} y_i x_i <\/span>\n\n\n\n<p>que es un conjunto de dos ecuaciones lineales simultaneas con dos inc\u00f3gnitas a<sub>0<\/sub> y a<sub>1<\/sub>, los coeficientes del sistema de ecuaciones son las sumatorias que se obtienen completando la siguiente tabla:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>x<sub>i<\/sub><\/th><th>y<sub>i<\/sub><\/th><td>x<sub>i<\/sub>y<sub>i<\/sub><\/td><td>x<sub>i<\/sub><sup>2<\/sup><\/td><td>y<sub>i<\/sub><sup>2<\/sup><\/td><\/tr><tr><td>x<sub>0<\/sub><\/td><td>y<sub>0<\/sub><\/td><td>x<sub>0<\/sub>y<sub>0<\/sub><\/td><td>x<sub>0<\/sub><sup>2<\/sup><\/td><td>y<sub>0<\/sub><sup>2<\/sup><\/td><\/tr><tr><td>...<\/td><td>...<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>...<\/td><td>...<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><th>\u2211 x<sub>i<\/sub><\/th><th>\u2211 y<sub>i<\/sub><\/th><td>\u2211 x<sub>i<\/sub>y<sub>i<\/sub><\/td><td>\u2211 x<sub>i<\/sub><sup>2<\/sup><\/td><td>\u2211 y<sub>i<\/sub><sup>2<\/sup><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{bmatrix} n &amp; \\sum x_i \\\\ \\sum x_i &amp; \\sum x_i^2 \\end{bmatrix} \\begin{bmatrix} a_0 \\\\ a_1 \\end{bmatrix} = \\begin{bmatrix} \\sum y_i \\\\ \\sum x_i y_i \\end{bmatrix}<\/span>\n\n\n\n<p>cuya soluci\u00f3n es:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_1 = \\frac{n \\sum x_i y_i - \\sum x_i \\sum y_i}{n \\sum x_i^2 - \\big( \\sum x_i \\big) ^2 }<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 = \\overline{y} - a_1 \\overline{x}<\/span>\n\n\n\n<p>usando la media de los valores en cada eje para encontrar a<sub>0<\/sub><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Coeficiente de correlaci\u00f3n<\/h3>\n\n\n\n<p>El coeficiente de correlaci\u00f3n se puede obtener con las sumatorias anteriores usando la siguiente expresi\u00f3n:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> r= \\frac{n \\sum x_i y_i - \\big( \\sum x_i \\big) \\big( \\sum y_i\\big)} {\\sqrt{n \\sum x_i^2 -\\big(\\sum x_i \\big) ^2 }\\sqrt{n \\sum y_i^2 - \\big( \\sum y_i \\big)^2}}<\/span>\n\n\n\n<p>En un ajuste perfecto, S<sub>r<\/sub> = 0 y r = r<sup>2<\/sup> = 1, significa que la l\u00ednea explica<br>el 100% de la variabilidad de los datos.<\/p>\n\n\n\n<p>Aunque el coeficiente de correlaci\u00f3n ofrece una manera f\u00e1cil de medir la bondad del ajuste, se deber\u00e1 tener cuidado de no darle m\u00e1s significado del que ya tiene.<\/p>\n\n\n\n<p>El solo hecho de que r sea \u201ccercana\u201d a 1 no necesariamente significa que el ajuste sea \u201cbueno\u201d. Por ejemplo, es posible obtener un valor relativamente alto de r cuando la relaci\u00f3n entre <code>y<\/code> y <code>x<\/code> no es lineal.<\/p>\n\n\n\n<p>Los resultados indicar\u00e1n que el modelo lineal explic\u00f3 r<sup>2<\/sup> % de la incertidumbre original<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Regresi\u00f3n por M\u00ednimos Cuadrados con Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/rU1dxbkNHbE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Algoritmo en Python<\/h2>\n\n\n\n<p>Siguiendo con los datos propuestos del ejemplo en Chapra 17.1 p470:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\nxi = &#x5B;1, 2, 3, 4, 5, 6, 7] \nyi = &#x5B;0.5, 2.5, 2., 4., 3.5, 6, 5.5]\n<\/pre><\/div>\n\n\n<p>Aplicando las ecuaciones para a<sub>0<\/sub> y a<sub>1<\/sub> se tiene el siguiente resultado para los datos de prueba:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; gutter: false; title: ; notranslate\" title=\"\">\n f =  0.839285714285714*x + 0.0714285714285712\ncoef_correlaci\u00f3n   r  =  0.9318356132188194\ncoef_determinaci\u00f3n r2 =  0.8683176100628931\n86.83% de los datos est\u00e1 descrito en el modelo lineal\n&gt;&gt;&gt;\n<\/pre><\/div>\n\n\n<p>con las instrucciones:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# m\u00ednimos cuadrados, regresi\u00f3n con polinomio grado 1\nimport numpy as np\nimport sympy as sym\nimport matplotlib.pyplot as plt\n\n# INGRESO\nxi = &#x5B;1,   2,   3,  4,  5,   6, 7]\nyi = &#x5B;0.5, 2.5, 2., 4., 3.5, 6, 5.5]\n\n# PROCEDIMIENTO\nxi = np.array(xi,dtype=float)\nyi = np.array(yi,dtype=float)\nn  = len(xi)\n\n# sumatorias y medias\nxm  = np.mean(xi)\nym  = np.mean(yi)\nsx  = np.sum(xi)\nsy  = np.sum(yi)\nsxy = np.sum(xi*yi)\nsx2 = np.sum(xi**2)\nsy2 = np.sum(yi**2)\n\n# coeficientes a0 y a1\na1 = (n*sxy-sx*sy)\/(n*sx2-sx**2)\na0 = ym - a1*xm\n\n# polinomio grado 1\nx = sym.Symbol('x')\nf = a0 + a1*x\n\nfx = sym.lambdify(x,f)\nfi = fx(xi)\n\n# coeficiente de correlaci\u00f3n\nnumerador = n*sxy - sx*sy\nraiz1 = np.sqrt(n*sx2-sx**2)\nraiz2 = np.sqrt(n*sy2-sy**2)\nr = numerador\/(raiz1*raiz2)\n\n# coeficiente de determinacion\nr2 = r**2\nr2_porcentaje = np.around(r2*100,2)\n\n# SALIDA\n# print('ymedia =',ym)\nprint(' f = ',f)\nprint('coef_correlaci\u00f3n   r  = ', r)\nprint('coef_determinaci\u00f3n r2 = ', r2)\nprint(str(r2_porcentaje)+'% de los datos')\nprint('     est\u00e1 descrito en el modelo lineal')\n\n# grafica\nplt.plot(xi,yi,'o',label='(xi,yi)')\n# plt.stem(xi,yi,bottom=ym,linefmt ='--')\nplt.plot(xi,fi, color='orange',  label=f)\n\n# lineas de error\nfor i in range(0,n,1):\n    y0 = np.min(&#x5B;yi&#x5B;i],fi&#x5B;i]])\n    y1 = np.max(&#x5B;yi&#x5B;i],fi&#x5B;i]])\n    plt.vlines(xi&#x5B;i],y0,y1, color='red',\n               linestyle ='dotted')\nplt.legend()\nplt.xlabel('xi')\nplt.title('minimos cuadrados')\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Coeficiente de correlaci\u00f3n con Numpy<\/h2>\n\n\n\n<p>Tambi\u00e9n es posible usar la librer\u00eda Numpy para obtener el resultado anterior,<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n&gt;&gt;&gt; coeficientes = np.corrcoef(xi,yi)\n&gt;&gt;&gt; coeficientes\narray(&#x5B;&#x5B;1.        , 0.93183561],\n       &#x5B;0.93183561, 1.        ]])\n&gt;&gt;&gt; r = coeficientes&#x5B;0,1]\n&gt;&gt;&gt; r\n0.9318356132188195\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Referencia: Chapra 17.1.2 p 469. Burden 8.1 p499 Criterio de ajuste a una l\u00ednea recta por m\u00ednimos cuadrados Una aproximaci\u00f3n de la relaci\u00f3n entre los puntos xi, yi por medio de un polinomio de grado 1, busca minimizar la suma de los errores residuales de los datos. Se busca el valor m\u00ednimo para los cuadrados [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[42],"tags":[],"class_list":["post-8016","post","type-post","status-publish","format-standard","hentry","category-mn-u08"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8016","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=8016"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8016\/revisions"}],"predecessor-version":[{"id":13924,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8016\/revisions\/13924"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=8016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=8016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=8016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}