3.3.2 Aproximação de Funções — Regressões — Regressão Linear Múltipla
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.
4. Copyright
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/.