Sunteți pe pagina 1din 15

INTELIGENCIA ARTIFICIAL

!
!
!

!!
!

Laboratorio 1: Regresin Lineal


Introduccin
En este ejercicio, se implementar un algorithm de regresin lineal y se ver
como este trabaja con datos. Antes de empezar con este ejercicio de
programacin, se recomienda leer el material de la clase del tema asociado.
Para empezar con el ejercicio, necesitar obtener el cdigo de inicio y
descomprimir su contenido a la carpeta en la que desea completar el ejercicio. Si
se necesita, usar el comando cd en Octave para cambiar a ese directorio antes de
empezar este ejercicio.
Tambin se puede encontrar instrucciones para instalar Octave en el documento
adjunto Instalacin de Octave

Archivos Incluidos en el ejercicio

!
!
!
!!
!!

ex1.m - Script de Octave que ayudar a avanzar con el ejercicio


ex1 multi.m - Script de Octave para la parte ltima del ejercicio
ex1data1.txt - Conjunto de datos para regresin lineal con una variable
ex1data2.txt - Conjunto de datos para regresin lineal con mltiples variables
[*] warmUpExercise.m - Ejemplo de una funcin simple en Octave
[*] plotData.m - Funcin que muestra el conjunto de datos
[*] computeCost.m - Funcin que calcula el costo de la regresin lineal
[*] gradientDescent.m - Funcin que ejecuta el gradiente de descenso
[] computeCostMulti.m - Funcin de costo para variables mltiples
[] gradientDescentMulti.m - Gradiente de descenso para variables
mltiples
[] featureNormalize.m - Funcin para normalizar las caractersticas
[] normalEqn.m - Funcin que calcula las ecuaciones normales

* indica los archivos que necesitan ser completados


Indica ejercicios adicionales

!1

!!

!
!

A traves del ejercicio, se usarn los scripts ex1.m y ex1_multi.m.


Estos scripts configuran el conjunto de datos para los problemas y realizan
llamadas a las funciones que usted escribir. No necesita modificar ninguno de
los scripts. Solo se requiere que modifique funciones en otros archivos,
siguiendo las instrucciones en esta asignacin.
Para este ejercicio de programacin, solo se requiere que complete la primera
parte del ejercicio para implementar regresin lineal con una variable. La
segunda parte del ejercicio, la cual puede completar para obtener puntos
adicionales, cubre regresin lineal con multiples variables.

Donde conseguir ayuda


Los ejercicios en este curso usan Octave, un lenguaje de programacin de alto
nivel bien adaptado para clculos numricos.
En la lnea de comandos de Octave, al escribir help seguida por el nombre
de una funcin muestra la documentacin para una funcin incluida en el
programa. Por ejemplo, help plot mostrar informacin de ayuda de como
realizar un grfico.

1. Funcin Simple de octave


La primera parte de ex1.m brinda prctica con la sintaxis de Octave. En el
archivo warmUpExercise.m, se encontrar el esquema de una funcin de
Octave. Modificarla para que retorne una matriz identidad de 5 x 5 rellenando el
siguiente cdigo:
A = eye(5);

Cuando termine, ejecutar ex1.m (asumiendo que esta en directorio


correcto, escribir ex1 en el prompt de Octave) y deber ver una salida similar
a lo siguiente:
ans =

Diagonal Matrix
1
0
0
0
0

!
!
!
!
!

Octave es una alternativa libre a MATLAB. Para los ejercicios de programacin, es libre de usar
ya sea Octave o MATLAB.

!2

!
!!

Ahora ex1.m pausar hasta que se presione cualquier tecla, y luego ejecutar
el cdigo para la siguiente parte de la asignacin. S i d e s e a d e t e n e r l a
e j e c u c i n , p r e s i o n a r l a s t e c l a s ctrl-c lo cual detendr la
ejecucin a la mitad.

1.1.

Enviando la Solucin

Despus de completar el ejercicio, este se debe de enviar a la direccin de correo


electrnico vbriceno@outlook.com incluyendo la seccin y el grupo en el
asunto, por ejemplo si el Grupo 1 de la seccin E va a enviar su trabajo, los
integrantes del grupo deben escribir en el asunto: IA - Seccin E - Grupo 1.

2. Regresin lineal con una variable


En esta parte del ejercicio, se implementar regresin lineal con una variable
para predecir las ganancias de un camin de comida. Suponga que usted es el
CEO de una franquicia de restaurantes y est considerando diferentes ciudades
para la apertura de un nuevo local. La cadena ya tiene camiones en varias
ciudades y tiene datos de las ganancias y el nmero de habitantes para las
ciudades.
Te gustara usar estos datos para ayudarte a seleccionar cual sera la siguiente ciudad
a expandirte.

El archivo ex1data1.txt contiene el conjunto de datos para nuestro


problema de regresin lineal. La primera columna es la poblacin de una ciudad y
la segunda columna son las ganancias del camin de comida en esa ciudad. Un
valor de ganancia negativa indica prdida.
El script ex1.m ya ha sido configurado para que cargue estos datos por ti.

2.1.

Graficando los datos

Antes de iniciar cualquier tarea, es usualmente de ayuda el entender los datos


visualizndolos. Para este conjunto de datos, se puede usar un grfico de
dispersin para visualizar los datos, dado que este tiene solo dos propiedades
que graficar (ganancias y poblacin). (Muchos de otros ejemplos que se
encontrar en la vida real son multidimensionales y no pueden ser graficados en
2-d.)
En ex1.m, el conjunto de datos es cargado del archivo a las variables X e y:
data = load('ex1data1.txt');
X = data(:, 1); y = data(:, 2);
m = length(y);

% read comma separated data


% number of training examples

!3

Luego, el script llama a la funcin plotData para crear un grfico de


dispersin de los datos. Su trabajo es completar plotData.m para dibujar el
grfico; modificar el archivo y llenarlo con el siguiente cdigo:
plot(x, y, 'rx', 'MarkerSize', 10);
ylabel('Profit in $10,000s');
xlabel('Population of City in 10,000s');

% Plot the data


% Set the yaxis label
% Set the xaxis label

Ahora, cuando se continua ejecutando ex1.m, nuestro resultado final debera


parecerse a la figura 1, con las mismas x" rojas de marcadores y etiquetas de ejes.
Para aprender mas a cerca del comando plot, puede escribir help plot en el
prompt de Octave o buscar en linea la documentacin del comando. (Para
cambiar los marcadores a "x" roja, se us la opcin rx" junto con el comando plot,
ejm., plot(..,[tus opciones ac],.., rx); )

2.2.

Pendiente de descenso

Ganancias en $ 10000

En esta parte, se encontrar los parmetros de regresin lineal para nuestro conjunto
de datos usando la pendiente de descenso.

Poblacin de la ciudad en 10000s

!!

Figure 1: Grfico de dispersin de los datos de entrenamiento


!4

2.2.1.

!
!
!
!

!
!
!

El objetivo de la regresin lineal es minimizar la funcin de costo

donde la hiptesis h (x) esta dada por el modelo lineal

T
h (x) = x = 0 + 1x1
Recuerde que los parmetros de su modelo son los valores de j. Estos son
los valores que ajustar para minimizar la funcin de costo J (). Una forma de
hacer esto es usando el algoritmo de pendiente de descenso batch. En la
pendiente de descenso batch, cada iteracin realiza una actualizacin each
iteration performs the update

(simultneamente actualiza j para todos los j)


Con cada paso de la pendiente de descenso, los parmetros j se acercan ms a los
valores ptimos que alcanzarn el costo mas bajo de J ().
Nota de implementacin: Almacenamos cada ejemplo como una fila en la matriz
X en Octave. Para tomar en consideracin el termino de interceptacin (0),
adicionamos una primera columna adicional a X y fijamos todos los valores a
uno. Esto nos permite tratar a 0 como simplemente otra caracterstica.
2.2.2.

!
!

Ecuaciones de actualizacin

Implementacin

En ex1.m, ya se ha fijado los datos para regresin lineal. En las siguientes


lineas, se adiciona otra dimensin a nuestros datos para acomodar el trmino de
interceptacin 0. Tambin inicializamos los parmetros iniciales a 0 y la tasa de
aprendizaje alpha a 0.01.
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters
iterations = 1500;
alpha = 0.01;

!5

!
2.2.3. Calculando el costo de J ()

!!

A medida que se ejecuta la pendiente de descenso para aprender a minimizar la


funcin de costo J (), es de ayuda el monitorear la convergencia calculando el
costo. En esta seccin, se implementar una funcin para calcular J ()
entonces se puede verificar la convergencia de la implementacin de la
pendiente de descenso.
La siguiente tarea es completar el cdigo en el archivo computeCost.m, el
cual es la funcin que calcula J (). Al momento de hacerlo, recuerda que las
variables X e y no son valores escalares, si no matrices cuyas filas representan
los ejemplos del conjunto de entrenamiento.
Una vez completada la funcin, el siguiente paso en ex1.m ejecutar
computeCost una vez usando inicializada a ceros, y s e v e r e l c o s t o
impreso en la pantalla.
Se debe esperar ver un costo de 32.07.
2.2.4.

Pendiente de descenso

Seguidamente, se implementar la pendiente de descenso en el archivo


gradientDescent.m. La estructura de bucle ha sido escrita por ti, y solo se
necesita proporcionar las actualizaciones a dentro de cada iteracin.
A medida que se va programando, asegurarse de entender que es lo que se est
tratando de optimizar y que es lo que se est actualizando. Tener presente que el
costo J () es parametrizado por el vector , no X e y. Lo que significa que,
minimizamos el valor de J () cambiando los valores del vector , no cambiando X
o y.
Una buena manera de verificar que la pendiente de descenso esta
funcionando correctamente es mirando al valor de J () y verificando que este
est decreciendo con cada paso. El cdigo de inicio para gradientDescent.m
llama a computeCost en cada iteracin e imprime el costo. Asumiendo que se
ha implementado la pendiente de descenso y computeCost correctamente, el
valor de J () nunca debe incrementarse, y deber converger a un valor estable al final
del algoritmo.
Despus de finalizar, ex1.m usar los parmetros finales para graficar el
encaje lineal. El resultado debe verse algo como la figura 2:
Los valores finales para tambin sern usados para hacer predicciones de las
ganancias en reas de 35,000 y 70,000 personas. Notar la forma en que las
siguientes lineas en ex1.m usan la multiplicacin de matrices, en lugar de sumas
explcitas o hacer un bucle, para calcular las predicciones. Este es un ejemplo de
vectorizacin de cdigo en Octave.

!6

!
!
!

predict1 = [1, 3.5] * theta;


predict2 = [1, 7] * theta;

2.3 Depurando
Aqu hay algunas cosas para tener en mente al momento de implementar la pendiente
de descenso:
Los indices de los arreglos en Octave inician en uno, no en cero. Si se est
almacenando 0 y 1 en un vector llamado theta, los valores sern theta(1)
y theta(2).

Si ve muchos errores al momento de la ejecucin, inspeccionar la matriz de


operacin para asegurarse que se est sumando y multiplicando matrices de
dimensiones compatibles. Imprimiendo las dimensiones de las variables
con el comando size te ayudar a depurar.

Ganancias en $ 10000

Poblacin de la ciudad en 10000s

Figure 2: Datos de entrenamiento con regresin lineal encajada

!!

Por defecto, Octave interpreta los operadores matemticos como si fueran


operadores de matrices. Esto es una fuente comn de errores de
incompatibilidad por tamao. Si no se quiere una multiplicacin de
matrices, se necesita agregar un punto para especificar esto a Octave. Por
ejemplo ejemplo, A*B realiza la multiplicacin de matrices, mientras
!7

A.*B realiza una multiplicacin elemento por elemento.

!!

2.4 Visualizando J ()

!
!

!
!!

Para entender la funcin de costo J () mejor, se graficar ahora la funcin de


costo sobre una cuadrcula de dos dimensiones con valores de 0 y 1. No se
necesita codificar nada nuevo para esta parte, pero debe entender como el
cdigo que haz escrito esta creando estas imgenes.
En el siguiente paso de ex1.m, hay cdigo escrito para calcular J () sobre
la cuadrcula de valores usando la funcin computeCost que se escribi.
% initialize J vals to a matrix of 0's
J_ vals = zeros(length(theta0_ vals), length(theta1_ vals));
% Fill out J_ vals
for i = 1:length(theta0_vals)
for j = 1:length(theta1_vals)
t = [theta0_ vals(i); theta1_ vals(j)];
J_ vals(i,j) = computeCost(x, y, t);
end
!
end

Despus que estas lineas son ejecutadas, se tendr un arreglo de 2-D de


valores de J (). El script ex1.m usar luego estos valores para producir una
superficie y un grfico de nivel de J () usando los comandos surf y
contour. Los grficos deben verse similares como la figura 3:
!

!!
!

(b) Grco de nivel, mostrando el mnimo

(a) Supercie

Figura 3: Funcin de costo J ()


!8

El propsito de este grfico mostrar como vara J () con los cambios en 0


y 1. La funcin de costo he cost function J () tiene forma de tazn y tiene un
mnimo global. (Esto es mas fcil de ver en la grfica de nivel que en la
superficie en 3D). Este mnimo es el punto ptimo para 0 y 1, y cada paso de
la pendiente de descenso se acerca a este punto.

!9

!!
!!
!

!!

Ejercicio de crditos extra (opcional)


Si haz completado de manera exitosa el material previo, felicitaciones! Ahora
entiendes regresin lineal y debes ser capaz de empezar a usar tu propio
conjunto de datos.
Para el resto de este ejercicio de programacin, se ha incluido los siguientes
ejercicios que darn crditos extra. Estos ejercicios te ayudarn a ganar un
entendimiento mas profundo del material, y si eres capas de realizarlos, te
alentamos a que los completes tambin.

3. Regresin lineal con mltiples variables


En esta parte, se implementar regresin lineal con mltiples variables para
predecir los precios de casas. Supongamos que est vendiendo casas y quiere
saber cual ser un buen precio de mercado. Una manera de hacer esto es
primeramente recolectar informacin de casas recientemente vendidas y hacer un
modelo de precios de casas.
El archivo ex1data2.txt contiene un conjunto de entrenamiento del
precio de casas en Portland, Oregon Estados Unidos. La primera columna es el
tamao de la casa (en pies cuadrados), la segunda columna es el nmero de
habitaciones, y la tercera columna es el precio de la casa.
El script ex1_multi.m ha sido escrito para ayudarte a travs de este
ejercicio.

3.1.

El script ex1_multi.m iniciar cargando y mostrando algunos valores de este


grupo de datos. Mirando los valores, notar que el tamao de las casas son
aproximadamente 1000 veces el nmero de habitaciones. Cuando las
caractersticas difieren por varios ordenes de magnitud, primero realizando el
escalado de las caractersticas puede hacer que la pendiente de descenso
converja de manera mas rpida.
Tu tarea es completar el cdigo en featureNormalize.m para

!!

Normalizacin de caractersticas

Restar el valor promedio de cada caracterstica del conjunto de datos.


Despus de restar el promedio, adicionalmente escalar (dividir) los valores
de las caractersticas por su respectiva desviacin estndar.
!10

!!
!

La desviacin estndar es una manera de medir cuanta variacin hay en el


rango de valores de una caracterstica particular (muchos de los puntos dato
estarn entre 2 de desviacin estndar del promedio); esta es una alternativa a
tomar el rango de valores (max-min). En Octave, se puede usar la funcin std
para calcular la desviacin estndar. P o r e j e m p l o , d e n t r o d e
featureNormalize.m, la cantidad X(:,1) contiene todos los valores de
x1 (tamaos de las casas) en el grupo de entrenamiento, entonces std(X(:,
1)) calcula la desviacin estndar del tamao de las casas. Al momento de
llamar featureNormalize.m, la columna extra de 1s correspondiente
a x0 = 1 no ha sido incluido an a X (ver ex1 multi.m para mayor
detalle).
Se har lo mismo para todas las caractersticas y el cdigo debe funcionar
con conjuntos de datos de todos los tamaos (cualquier nmero de caractersticas
/ejemplos). Notar que cada columna de la matriz X corresponde a una
caracterstica.

!!
!!

Nota de implementation: Cuando se normaliza las caractersticas, es


importante almacenar los valores usados para la normalizacin - el valor
promedio y la desviacin estndar usados para los clculos. Despus de
aprender los parmetros del modelo, querremos predecir los precios de las
casas que no hemos visto anteriormente. Dado un nuevo valor de x (area de
la sala y el nmero de habitaciones), debemos primeramente normalizar x
usando el promedio y la desviacin estndar que hemos calculado
previamente de nuestro conjunto de entrenamiento.

3.2.

Pendiente de descenso

Previamente, se implement la pendiente de descenso en un problema de


regresin de una variable. La nica diferencia ahora es que hay una
caracterstica mas en la matriz X. La funcin hiptesis y la regla de
actualizacin de la pendiente de descenso batch permanecen sin cambios.
Debe completar el cdigo en computeCostMulti.m y gradientDescentMulti.m
para implementar la funcin de costo el gradiente de descenso para la regresin
lineal con multiples variables. Si tu cdigo en la parte previa (una variable) ya
soporta variable mltiples, puedes usarla ac tambin.
Asegurarse que el cdigo soporte cualquier nmero de caractersticas y esta bien
vectorizado. Puede usar size(X, 2) para encontrar cuantas caractersticas estn
presentes en el conjunto de datos

!11

Nota de implementation: En el caso de mltiples variables, la funcin de


costo tambin puede ser escrita en la siguiente forma vectorial:

donde

!!
!

La versin vectorizada es eficiente cuando estas trabajando con herramientas


de clculo numrico como Octave. Se puede probar que ambas formas son
equivalentes.

3.2.1 Ejercicio Opcional (no calificado): Seleccionando tasas de aprendizaje

En esta parte del ejercicio, se probar diferentes tasas de aprendizaje para el


conjunto de datos y encontrar la tasa de aprendizaje que converge
rpidamente. Puedes cambiar las tasas de aprendizaje modificando ex1_multi.m
y cambiando la parte del cdigo que establece la tasa de aprendizaje.
La siguiente fase en ex1_multi.m llamar a la funcin
gradientDescent.m y ejecutar la pendiente de descenso por
aproximadamente 50 iteraciones en la tasa de aprendizaje elegida. La funcin
debe tambin retornar la historia de valores J () en un vector J. Despus de la
ltima iteracin, el script ex1_multi.m grafica los valores de J versus el
nmero de iteraciones.
Si se escogi una tasa de aprendizaje dentro de un buen rango, el grfico se
ver similar a la Figura 4. Si el grfico se ve muy diferente, especialmente si el
valor de J () aumenta o inclusive si explota, ajustar la tasa de aprendizaje e intentar
nuevamente. Recomendamos probar valores de tasa de aprendizaje en una escala
larga, en pasos de multiplicacin de aproximadamente 3 veces el valor previo (ejm.,
0.3, 0.1, 0.03, 0.01 y as sucesivamente). Tambin se debera ajustar el nmero de
iteraciones que se estn ejecutando si eso ayudara a ver la curva de tendencia general.

!12

Costo J

!
!

Nmero de iteraciones

Figura 4: Convergencia de la pendiente de descenso con un valor apropiado de


la tasa de aprendizaje
Nota de implementation: Si la tasa de aprendizaje es muy grande, J ()
puede diverger y explotar, resultando en valores que son muy elevados
para el clculo en computador. En esta situacin, Octave tender a retornar
NaNs. NaN significa No es Nmero y es comnmente causado por
operaciones no definidas que involucran y +.
Consejo Octave: Para comparar como diferentes tasas de aprendizaje afectan la
convergencia, es de mucha ayuda graficar J para varias tasas de aprendizaje en
la misma figura. En Octave, esto puede hacerse realizando Pendiente de
Descenso varias veces con el comando hold on entre grficos.
Concretamente, si se ha probado tres valores diferentes de alpha (deberas
probablemente probar mas valores que esto) y almacenar los costos en
J1, J2 y J3, se puede usar los siguientes comandos para
graficarlos en la misma figura:
plot(1:50, J1(1:50), b);
hold on;
plot(1:50, J2(1:50), r);
plot(1:50, J3(1:50), k);
Los argumentos finales b, r, y k especifican colores diferentes
para las grficas.
!13

!!

Notar los cambios en las curvas de convergencia a medida que cambia la


tasa de aprendizaje. Con una tasa de aprendizaje pequea, encontrars que la
pendiente de descenso toma un tiempo bastante largo para converger al valor
ptimo. Contrariamente, con un valor grande de tasa de aprendizaje, la
pendiente de descenso puede no converger o por el contrario diverger.
Usando la mejor tasa de aprendizaje que se encuentre, ejecutar el script
ex1_multi.m para ejecutar la pendiente de descenso hasta que converja al
encontrar los valores finales de . Siguiente, usar este valor de para predecir
el precio de una cad de 1650 pies cuadrados y 3 dormitorios. Se usar el
valor luego para verificar la implementacin de la ecuacin normal.
No se olvide de normalizar sus caractersticas cuando se hacen esta
prediccin.

3.3

Ecuacin normal

En la clase, aprendimos que la forma cerrada de solucin para la regresin lineal es


como sigue:

Usando esta frmula no se requiere ningn escalamiento de caractersticas, y


se obtendr una solucin exacta en un solo clculo: no hay bucle hasta que
converja como en la pendiente de descenso.
Completar el cdigo en normalEqn.m para usar la formula anterior y
calcular . Recuerde que mientras no se necesite escalar las caractersticas, an
se necesita agregar una columna de 1s a la matriz X para tener un trmino
interceptor (0). E l c d i g o e n ex1.m agregar la columna de 1s a X por
ti.
Ejercicio Opcional (no calificado): Ahora, una vez que haz encontrado
usando este mtodo, usarlo para hacer una prediccin de precio para una casa de
1650 pies cuadrados con 3 habitaciones. Se debe encontrar que se obtiene la
misma prediccin de precio que el valor obtenido usando el modelo obtenido
con la pendiente de descenso (en Seccin 3.2.1).

!14

!!
!
!

Envo y calificacin
Despus de completar varias partes de la asignacin, asegurarse de enviar por
correo las soluciones. A continuacin se muestra como sern calificados los
ejercicios.
Parte
Ejercicio de calentamiento

Archivo enviado
warmUpExercise.m

Puntos
2 puntos

Calcular el costo para una variable


Pendiente de descenso para una
variable

computeCost.m
gradientDescent.m

8 puntos
10 puntos

Puntos Totales

20 puntos

Ejercicios de Creditos extra (opcional)


Normalizacin de caractersticas
Clculo del costo para mltiples
variables
Pendiente de descenso para
mltiples variables
Ecuacin Normal

featureNormalize.m
computeCostMulti.m

gradientDescentMulti.m
normalEqn.m

!15

1 puntos
2 puntos

2 points
1 puntos

S-ar putea să vă placă și