%%This exercise uses a data from the UCI repository:% Bache, K. & Lichman, M. (2013). UCI Machine Learning Repository% http://archive.ics.uci.edu/ml% Irvine, CA: University of California, School of Information and Computer Science.%%Data created by:% Harrison, D. and Rubinfeld, D.L.% ''Hedonic prices and the demand for clean air''% J. Environ. Economics & Management, vol.5, 81-102, 1978.%
addpath ../common
addpath ../common/minFunc_2012/minFunc
addpath ../common/minFunc_2012/minFunc/compiled
% Load housing data from file.
data = load('housing.data');
data=data'; % put examples in columns% Include a row of 1s as an additional intercept feature.
data = [ ones(1,size(data,2)); data ];
% Shuffle examples.
data = data(:, randperm(size(data,2)));
% Split into train and test sets% The last row of 'data' is the median home price.train.X = data(1:end-1,1:400);
train.y = data(end,1:400);
test.X = data(1:end-1,401:end);
test.y = data(end,401:end);
m=size(train.X,2);
n=size(train.X,1);
% Initialize the coefficient vector theta to random values.
theta = rand(n,1);
% Run the minFunc optimizer with linear_regression.m as the objective.%% TODO: Implement the linear regression objective and gradient computations% in linear_regression.m%
tic;
options = struct('MaxIter', 200);
theta = minFunc(@linear_regression, theta, options, train.X, train.y);
fprintf('Optimization took %f seconds.\n', toc);
% Run minFunc with linear_regression_vec.m as the objective.%% TODO: Implement linear regression in linear_regression_vec.m% using MATLAB's vectorization features to speed up your code.% Compare the running time for your linear_regression.m and% linear_regression_vec.m implementations.%% Uncomment the lines below to run your vectorized code.%Re-initialize parameters%theta = rand(n,1);%tic;%theta = minFunc(@linear_regression_vec, theta, options, train.X, train.y);%fprintf('Optimization took %f seconds.\n', toc);% Plot predicted prices and actual prices from training set.
actual_prices = train.y;
predicted_prices = theta'*train.X;
% Print out root-mean-squared (RMS) training error.
train_rms=sqrt(mean((predicted_prices - actual_prices).^2));
fprintf('RMS training error: %f\n', train_rms);
% Print out test RMS error
actual_prices = test.y;
predicted_prices = theta'*test.X;
test_rms=sqrt(mean((predicted_prices - actual_prices).^2));
fprintf('RMS testing error: %f\n', test_rms);
% Plot predictions on test data.
plot_prices=true;
if (plot_prices)
[actual_prices,I] = sort(actual_prices);
predicted_prices=predicted_prices(I);
plot(actual_prices, 'rx');
hold on;
plot(predicted_prices,'bx');
legend('Actual Price', 'Predicted Price');
xlabel('House #');
ylabel('House price ($1000s)');
end
function [f,g] = linear_regression(theta, X,y)
%
% Arguments:
% theta - A vector containing the parameter values to optimize.
% X - The examples stored in a matrix.
% X(i,j) isthe i'th coordinate ofthe j'th example.
% y - The target value for each example. y(j) isthe target for example j.
%
m=size(X,2);
n=size(X,1);
f=0;
g=zeros(size(theta));
%
% TODO: Compute the linear regression objective by looping overthe examples in X.
% Store the objective function value in 'f'.
%
% TODO: Compute the gradient ofthe objective with respect to theta by looping over
% the examples in X and adding up the gradient for each example. Store the
% computed gradient in 'g'.
%%% YOUR CODE HERE %%%
% Compute 'f' asthe objective function with looping.
for i = 1:m
f = f + ( theta' * X(:,i) - y(i) ) ^2;
end
f = f / 2;
% Compute 'g' asthe gradient ofthe objective w.r.t theta by looping
for j = 1:n
for i = 1:m
g(j) = g(j) + X(j,i) * (theta' * X(:,i) - y(i) );
endend