Ir al contenido principal

Regresión Lineal con una variable Implementación


En este ejercicio, se implementará la regresión lineal con una variable para predecir los beneficios de un carro sanguchero. Supongamos que el gerente de una franquicia de carros sanguchero y está considerando diferentes ciudades para expandirse. La cadena ya tiene carros sanguchero en varias ciudades y se tiene datos de las ganancias y el tamaño poblacion de las ciudades.
Y nos gustaria usar esa data para ayudarnos a elegir la siguiente ciudad para expandirse.


Plotting the Data

El archivo ex1data1.txt contiene el conjunto de datos para nuestro problema de regresión lineal. La primera columna es la población de una ciudad y la segunda columna es el beneficio de un carro sanguchero en esa ciudad. Un valor negativo para el beneficio indica un pérdida.
El script ex1.m ya ha sido configurado para cargar estos datos para usted.
Antes de comenzar cualquier tarea, a menudo es útil comprender los datos visualizándolos. Para este conjunto de datos, puede utilizar un diagrama de dispersión para visualizar los datos, ya que sólo tiene dos propiedades para trazar (beneficio y población). (Muchos otros problemas que se encontrarán en la vida real son multidimensionales y no se pueden graficar en una grafica de 2d).
En ex1.m, el conjunto de datos se carga desde el archivo de datos en las variables X y y:  



data = load('ex1data1.txt');
X = data(:, 1); y = data(:, 2);
m = length(y); % number of training examples
A continuación, el script llama a la función plotData para crear un diagrama de dispersión de los datos con las siguientes lineas.
plot(x, y, 'rx', 'MarkerSize', 10);
ylabel('Profit in $10,000s');
xlabel('Population of City in 10,000s');

Ahora, cuando continúes ejecutando ex1.m, nuestro resultado final debería ser similar al de la Figura 1, con los mismos marcadores rojos "x" y etiquetas de eje.

Figura 1
Gradient Descent 
En esta parte, se ajustará los parámetros de regresión lineal θ a nuestro conjunto de datos usando el gradient descent.
El objetivo de la regresión lineal es minimizar la función de coste o cost function.
 donde la hipótesis está dada por el modelo lineal

El objetivo ahora es ajustar los parametros θj de nuestro modelo. Estos son los valores que ajustaremos para minimizar el cost function. Una forma de realizar esto es usar el algoritmo batch gradient descent. En batch gradient descent cada iteracion realiza la actualización.
 Con cada paso de gradient descent, sus parámetros θj se aproximan a los valores óptimos que alcanzarán el menor cost function J(θ).
En las líneas de codigo siguientes, agregamos otra dimensión a nuestros datos para acomodar el término de intersección θ0. También inicializamos los parámetros 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

% Some gradient descent settings
iterations = 1500;
alpha = 0.01;

A medida que se realiza el gradient descent para aprender a minimizar la función de coste J (θ), es útil monitorear la convergencia calculando el costo. Por eso implementaremos una función para calcular J(θ) para que pueda comprobar la convergencia de la implementación del gradient descent.
 El script computeCost.m es la función que calculara J(θ) con las siguientes lineas de codigo.

J = 0;
J = 1/(2*m)*((X*theta)-y)'*((X*theta)-y);
el siguiente paso en ex1.m ejecutará computeCost una vez usando θ inicializado en ceros, y se verá un costo impreso en la pantalla de 32.07 .
fprintf('\nTesting the cost function ...\n')
% compute and display initial cost
J = computeCost(X, y, theta);
fprintf('With theta = [0 ; 0]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 32.07\n');

Ahora implementamos el gradient descent en el archivo gradientDescent.m teniendo en cuenta que el objetivo es minimizar J(θ) al cambiar los valores del vector θ en cada paso. Una buena manera de verificar que el gradient descent esta funcionando correctamente es mirar el valor de J(θ) y comprobar que está disminuyendo con cada paso. Y debería converger a un valor constante al final del algoritmo.







for iter = 1:num_iters
temptheta1=theta(1,1) - alpha*(1/m)*sum((X*theta-y).*X(:,1));
temptheta2=theta(2,1) - alpha*(1/m)*sum((X*theta-y).*X(:,2));

theta(1,1)=temptheta1;
theta(2,1)=temptheta2;
J_history(iter) = computeCost(X, y, theta);
end

Luego usaremos los parametros finales para trazar el ajuste lineal.
El resultado debe ser algo similar a la figura siguiente.






Y ahora haremos un par de predicciones en los beneficios de areas con 35,000 y 70,000 personas:

% Predict values for population sizes of 35,000 and 70,000
predict1 = [1, 3.5] *theta;
fprintf('For population = 35,000, we predict a profit of %f\n',...
    predict1*10000);
predict2 = [1, 7] * theta;
fprintf('For population = 70,000, we predict a profit of %f\n',...
    predict2*10000);

Comentarios