1. Introdução

Estendendo o post sobre regressão linear simples, temos o caso em que o vetor y é gerado por uma função com duas ou mais variáveis. Isto é, ao invés de ajustarmos uma função dependendo de uma variável , utilizamos uma função na forma


$$y = \alpha_0 + \alpha_1 x_1 + \alpha_2 x_2 + \epsilon $$

Para esse caso, ao invés de ajustarmos os valores experimentais para uma reta, o ajuste é feito para um plano.

Assim como é feito na regressão linear simples, os valores dos coeficientes são determinados através da soma dos quadrados dos resíduos. Isto é, tomamos


$$ S_r = \sum_{i=1}^{n} \left( y_i – \alpha_0 – \alpha_1 x_{1i} – \alpha_2 x_{2i} \right)^2 $$

e derivamos essa equação em termos de cada coeficiente a ser determinado. Portanto


$$\frac{dS_r}{d \alpha_0} = -2 \sum \left( y_i – \alpha_0 – \alpha_1 x_{1i} – \alpha_2 x_{2i} \right) $$
$$\frac{dS_r}{d \alpha_1} = -2 \sum x_{1i} \left( y_i – \alpha_0 – \alpha_1 x_{1i} – \alpha_2 x_{2i} \right) $$
$$\frac{dS_r}{d \alpha_2} = -2 \sum x_{2i} \left( y_i – \alpha_0 – \alpha_1 x_{1i} – \alpha_2 x_{2i} \right) $$

Os coeficientes fornecendo a soma mínima dos quadrados dos resíduos são obtidos igualando-se as derivadas parciais a zero. Podemos expressar esse sistema na forma matricial como


$$ \left[ \begin{array}{ccc}
n & \sum x_{1i} & \sum x_{2i} \\
\sum x_{1i} & \sum x_{1i}^2 & \sum x_{1i} x_{2i} \\
\sum x_{2i} & \sum x_{1i} x_{2i} & \sum x_{2i}^2
\end{array} \right]
\left[ \begin{array}{c}
\alpha_0 \\ \alpha_1 \\ \alpha_2
\end{array} \right] =
\left[ \begin{array}{c}
\sum y_i \\ \sum x_{1i} y_i \\ \sum x_{2i} y_i
\end{array} \right] $$

 

2. Caso Geral

O caso geral estende o desenvolvimento bidimensional mostrado acima para dimensões. Isto é, a função linear tem a forma


$$y = \alpha_0 + \alpha_1 x_1 + \alpha_2 x_2 + \cdots + \alpha_m x_m + \epsilon $$

e erro padrão possui a forma


$$s = \sqrt{\dfrac{S_r}{n – (m + 1)} $$

3. Implementação

def multilinear_regression(points):
    """
    Return a FUNCTION with parameters adjusted by polinomial regression

    f = multilinear_regression(points)

    INPUT:
      * points: list of tuples of sampled points (x1_i, x2_i, ..., y_i)

    return: a linear function f(x) = a_0 + a_1 * x + ... + a_m * x

    Author: Pedro Garcia [sawp @sawp.com.br]
    see: http://www.sawp.com.br

    License: Creative Commons
             http://creativecommons.org/licenses/by-nc-nd/2.5/br/

    Sep 2011
    """
    def prepare_linear_system(x, y, order):
        A = [[0.0 for i in xrange(order)] for j in xrange(order)]
        B = [0.0 for i in xrange(order)]
        for row in xrange(order):
            for col in xrange(row, order):
                xc = [xi * xj for (xi, xj) in zip(x[row][:], x[col][:])]
                s = sum(xc)
                A[row][col] = s
                A[col][row] = s
            s = [yl * xl for (yl, xl) in zip(y, x[row][:])]
            B[row] = sum(s)
        return (A, B)

    def extract_points(points):
        M = zip(*points)
        y = M[-1]
        x = [[1.0 for i in xrange(len(y))]]
        for line in M[:-1]:
            x += [line]
        return (x, y)

    n = len(points[0])
    (x, y) = extract_points(points)
    (A, b) = prepare_linear_system(x, y, n)
    alphas = cholesky(A, b)
    fun = lambda t: sum([ti * a for (ti, a) in zip([1] + list(t), alphas)])
    return fun

Esta função está disponível em http://www.sawp.com.br/code/regression/multilinear_regression.py assim como um exemplo de como utilizá-la.

 

Este documento é disponível sob a licença Creative Commons. As regras dos direitos de cópia deste conteúdo estão acessíveis em http://creativecommons.org/licenses/by-nc-nd/2.5/br/.

 

References

[1] Anthony Ralston and Philip Rabinowitz, A First Course in Numerical Analysis (2nd ed.), McGraw-Hill and Dover, (2001).

[2] N.B Franco, Cálculo Numérico, Pearson Prentice Hall (2006).
</fieldset>