Create a gist now

Instantly share code, notes, and snippets.

Logistic regression for orange vs grapefruit
% data
x = [1, 2, 3, 4, 5, 6];
y = [0, 0, 0, 1, 1, 1];
% function to calculate the predicted value
function result = h(x, t0, t1)
result = sigmoid(t0 + t1 * x);
end
% sigmoid function
function result = sigmoid(z)
result = 1 / (1 + e ^ (-z));
end
% given a theta_0 and theta_1, this function calculates
% their cost. We don't need this function, strictly speaking...
% but it is nice to print out the costs as gradient descent iterates.
% We should see the cost go down every time the values of theta get updated.
function distance = cost(theta_0, theta_1, x, y)
distance = 0;
for i = 1:length(x) % arrays in octave are indexed starting at 1
if (y(i) == 1)
distance += -log(h(x(i), theta_0, theta_1));
else
distance += -log(1 - h(x(i), theta_0, theta_1));
end
end
% get how far off we were on average
distance = distance / length(x);
end
alpha = 0.1;
iters = 1500;
m = length(x);
% initial values
theta_0 = 0;
theta_1 = 0;
for i = 1:iters
% we store this calculation in temporary variables,
% because theta_0 and theta_1 must be updated *together*.
% i.e. we can't update theta_0 and use the new theta_0 value
% while updating theta_1.
cost_0 = 0;
for i = 1:m
cost_0 += (h(x(i), theta_0, theta_1) - y(i));
end
temp_0 = theta_0 - alpha * 1/m * cost_0;
cost_1 = 0;
for i = 1:m
cost_1 += ((h(x(i), theta_0, theta_1) - y(i)) * x(i));
end
temp_1 = theta_1 - alpha * 1/m * cost_1;
theta_0 = temp_0;
theta_1 = temp_1;
% print out the new values of theta for each iteration,
% as well as the new, lower cost
disp([theta_0, theta_1, cost(theta_0, theta_1, x, y)]);
end
% print out predictions for numbers 1 to 10
for i = 1:10
disp([i, h(i, theta_0, theta_1) * 100]);
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment