Saltar al contenido principal
LibreTexts Español

38.2: Encontrar la mejor solución en un sistema sobredeterminado

  • Page ID
    115575
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)
    %matplotlib inline
    import matplotlib.pylab as plt
    import numpy as np
    import sympy as sym
    import time
    sym.init_printing(use_unicode=True)

    Dejar\(Ax=y\) ser un sistema de ecuaciones\(m\) lineales en\(n\) variables. Una solución de mínimos cuadrados de\(Ax=y\) es una solución\(\hat{x}\) en\(R^n\) tal que:

    \[ \min_{\hat{x}}\|y - A\hat{x}\| \nonumber \]

    Tenga en cuenta que\(y\) sustituimos nuestra variable típica\(b\) aquí porque usaremos\(b\) más adelante para representar la intercepción a una línea y queremos intentar evitar confusiones en la notación. También concuerda con la imagen de arriba.

    En otras palabras,\(\hat{x}\) es un valor de\(x\) para el cual\(Ax\) es lo más cercano posible a\(y\). De conferencias anteriores, sabemos que esto es cierto si el vector\(y-A\hat{x}\) es ortogonal (perpendicular) al espacio de columna de\(A\).

    También sabemos que el producto punto es cero si dos vectores son ortogonales. Así que tenemos\(a \cdot (Ax - y) = 0 \), para todos los vectores\(a\) en el espacio de columna de\(A\).

    Las columnas de\(A\) abarcan el espacio de columna de\(A\). Denotar las columnas de\(A\) as\(A = [a_1, \cdots, a_n]\). Entonces tenemos\(a_1^\top (Ax - y) = 0\), es lo mismo que tomar la transposición de\(A\) y hacer una matriz multiplicar\(A^\top (Ax - y) = 0\).

    \[a_1^\top (Ax - y) = 0, \\ a_2^\top(Ax-y)=0\\\vdots \\a_n^\top(Ax-y)=0 \nonumber \]

    Es decir:

    \[A^\top Ax = A^\top y \nonumber \]

    La ecuación anterior se llama la solución de mínimos cuadrados a la ecuación original\(Ax=y\). La matriz\(A^\top A\) es simétrica e invertible. Entonces resolver para se\(\hat{x}\) puede calcular de la siguiente manera:

    \[x = (A^\top A)^{-1}A^\top y \nonumber \]

    La matriz también\((A^\top A)^{-1}A^\top\) se llama inversa izquierda.

    Ejemplo

    Un investigador ha realizado experimentos de una dosis de Hormona particular en una población de ratas. En la tabla se muestra el número de muertes en cada nivel de dosificación probado. Determinar la línea de mínimos cuadrados y utilizarla para predecir el número de muertes de ratas a dosis de hormona de 22.

    Nivel hormonal 20 25 30 35 40 45 50
    Fallecidos 101 115 92 64 60 50 49
    H = [20,25,30,35,40,45,50]
    f = [101,115, 92,64,60,50,49]
    
    plt.scatter(H,f)
    plt.xlabel('Hormone Level')
    plt.ylabel('Fatalities')
    f = np.matrix(f).T

    Queremos determinar una línea que se exprese mediante la siguiente ecuación

    \[f = aH + b, \nonumber \]

    para aproximar la conexión entre la dosis de Hormona (\(H\)) y las muertes\(f\). Es decir, queremos encontrar\(a\) (pendiente) e\(b\) (intercepción y) para esta línea. Primero definimos la variable\ (
    x =\ left [
    \ begin {matrix}
    a\\
    b
    \ end {matrix}
    \ right]
    \) como el vector de columna que necesita ser resuelto.

    Hacer esto

    Reescribe el sistema de ecuaciones a la forma\(Ax=y\) definiendo tus matrices numpy A e y usando los datos de arriba:

    #put your code here
    Pregunta

    Calcula la matriz cuadrada\(C = A^\top A\) y el vector del lado derecho modificado como\(A^\top y\) (Llámenlo Ati):

    #put your code here
    Pregunta

    Encuentra la solución de mínimos cuadrados resolviendo\(Cx=A^\top y\) para\(x\).

    # Put your code here
    Pregunta

    Dada la solución anterior, definir los dos escalares pendiente a e y-interceptar b.

    #put your code here

    El siguiente código trazará los datos originales y la línea estimada por los coeficientes encontrados en la cuación anterior.

    H = [20,25,30,35,40,45,50]
    f = [101,115, 92,64,60,50,49]
    plt.scatter(H,f)
    
    H2 = np.linspace(np.min(H), np.max(H))
    
    f2 = a * H2 + b
    
    plt.plot(H2, f2)
    Pregunta

    Repita el análisis anterior pero ahora con un polinomio de ocho órdenes.

    Pregunta

    Juega con la función interactiva a continuación ajustando el grado de aproximación de ajuste de mínimos cuadrados. Después extiende los parámetros x_min y x_max. ¿Crees que un polinomio de ocho órdenes es un buen modelo para este conjunto de datos? ¿Por qué o por qué no?

    from ipywidgets import interact, fixed
    import ipywidgets as widgets
    
    @interact(x=fixed(H), y=fixed(f), degree=widgets.IntSlider(min=1, max=8, step=1, value=8), x_min=widgets.IntSlider(min=min(H)-10, max=min(H), step=1, value=min(H)), x_max=widgets.IntSlider(min=max(H), max=max(H)+10, step=1, value=max(H)))
    def graphPolyN(x, y, x_min, x_max, degree):
        p = np.polyfit(x, y, degree)
        f = np.poly1d(p)
        
        x_pred = np.linspace(x_min, x_max, 1000)
        y_pred = f(x_pred)
        
        plt.scatter(x, y, color="red")
        plt.plot(x_pred, y_pred)
    Pregunta

    Consulta el rango de\(C=A^\top A\) para el caso anterior. ¿Qué obtienes? ¿Por qué?


    This page titled 38.2: Encontrar la mejor solución en un sistema sobredeterminado is shared under a CC BY-NC 4.0 license and was authored, remixed, and/or curated by Dirk Colbry via source content that was edited to the style and standards of the LibreTexts platform.