Instantly share code, notes, and snippets.

# egonSchiele/logistic_regression_grapefruit.m

Created March 10, 2016 03:54
Show Gist options
• Save egonSchiele/54abdc69ad843731eb77 to your computer and use it in GitHub Desktop.
Logistic regression for orange vs grapefruit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 % 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