script

jueves, 29 de mayo de 2014

Regresión lineal: Varias variables

Ya vimos en la entrada anterior como a partir de un conjunto de entrenamiento \((X, Y)\) podíamos generar una función que aproxime su comportamiento y utilizarla para estimar otros valores. Supongamos ahora que tenemos un conjunto de n variables de entrada y una salida; siguiendo la idea de la entrada anterior, tendríamos un conjunto como el siguiente:
\[ (X_1^1, X_2^1, ...,  X_j^1, ..., X_n^1, Y^1) \\ (X_1^2, X_2^2, ...,  X_j^2, ..., X_n^2, Y^2) \\ ... \\ (X_1^i, X_2^i, ...,  X_j^i, ..., X_n^i, Y^i) \\ ... \\ (X_1^m, X_2^m, ...,  X_j^m, ..., X_n^m, Y^m) \].

Como se puede ver en el ejemplo, vamos a seguir utilizando un superindice i para notar los indices dentro del conjunto pero ademas, vamos a agregar un subindice j de tamaño m para hacer referencia a la j-esima variable dentro de mi i-esimo elemento del conjunto. Nuestra función hipótesis, recordemos entonces, tenia la siguiente forma para el caso de una única variable:
\[h(x) = \theta_0 + X^i\theta_1\]
Extender esta idea a nuestro nuevo conjunto de entrada es relativamente sencillo, así que nuestra nueva hipótesis queda de la siguiente manera:
\[h(x_1, ..., x_n) = \theta_0 + X_1 \theta_1\ + ... + X_n \theta_n\]
Recordemos siempre que asumimos el valor por defecto de \(X_0 = 0\).
Veamos ademas que si tomamos la entrada de nuestra función \(h(x_1, ..., x_n)\) como un vector que contiene a dichas variables, el calculo de nuestra función se transforma simplemente en la multiplicación de dos matrices.

\[ \theta^T * X^i = \begin{bmatrix}
\theta_1, & \theta_2, & ..., & \theta_j, & ..., & \theta_n \end{bmatrix} *
\begin{bmatrix}
X_1  \\
X_2 \\
... \\
X_j \\
... \\
X_n \end{bmatrix} \]


En particular, no lo mencione pero necesitamos transponer el vector \([\theta_1, ..., \theta_n]\) por cuestiones de la multiplicación de matrices. Luego, utilizando este calculo que traduce todo en una sola multiplicación (a la hora de llevar todo esto a código, va a ser un alivio, créanme) podemos adaptar nuestras variables \(\theta\) de la siguiente manera:

                    mientras no converga {
                                con j desde 0 hasta n {
                                      \(\theta_j = \theta_j - a * \frac{1}{m} \sum\limits_{i=1}^m (h(X^i) - Y^i)^2 * X_i^j\)
                                }
                    }


Con esto, y dado que hicimos la introducción mas pesada en el calculo de una variable, ya tenemos los cambios necesarios para el calculo de la regresión lineal multivariada.

Para quienes gusten de mirar un poco de código, ya esta subido a mi GitHub (por el momento solo en Java, pero mas adelante podría agregar código en algún lenguaje mas, probablemente Clojure, para darle su versión funcional al tema). Si no usan Maven para importar las librerías, va a ser necesario que agreguen este .jar: EJML. Es una librería de matrices que use para no tener que implementar todo de cero y poder enfocarnos en el código que interesa. Cualquier duda, tienen a su disposición los comentarios.






No hay comentarios:

Publicar un comentario