Advertisement
zuevv

logreg2

Nov 2nd, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.87 KB | None | 0 0
  1. from mathfunctions import *
  2.  
  3.  
  4. def getxy(filename):
  5.     delimiter = ','
  6.     x_mtx = []
  7.     y_vec = []
  8.     with open(filename) as fin:
  9.         for line in fin:
  10.             line_list = list(map(float, line.strip().split(delimiter)))
  11.             x_mtx.append(line_list[:-1])
  12.             y_vec.append(line_list[-1])
  13.     # add intercept (bias) terms
  14.     bias = 1
  15.     for row in x_mtx:
  16.         row.insert(0, bias)
  17.     return x_mtx, y_vec
  18.  
  19.  
  20. def cost_and_grad(x_mtx, y_vec, theta_vec):
  21.     train_size = len(y_vec)
  22.     cost = 0
  23.     predict_vec = []
  24.     for x_vec, label in zip(x_mtx, y_vec):
  25.         hypothesis = sigm(mult(x_vec, theta_vec))
  26.         cost -= label * math.log(hypothesis) + (1 - label) * math.log(1 - hypothesis)
  27.         predict_vec.append(hypothesis)
  28.     cost /= train_size
  29.     # grad(theta) = (x'*(predictions-labels))/train_size
  30.     grad_vec = []
  31.     delta_vec = subtract(predict_vec, y_vec)
  32.     for icol in range(len(x_mtx[0])):  # for each column in x...
  33.         x_col_vec = [x_mtx[irow][icol] for irow in range(len(x_mtx))]
  34.         grad_vec.append(mult(x_col_vec, delta_vec) / train_size)
  35.     return cost, grad_vec
  36.  
  37.  
  38. def gradient_descent(x_mtx, y_vec, theta_vec, learn_rate=0.001, num_iter=5000):
  39.     for it in range(num_iter):
  40.         cost, grad_vec = cost_and_grad(x_mtx, y_vec, theta_vec)
  41.         for i in range(len(theta_vec)):
  42.             theta_vec[i] -= grad_vec[i] * learn_rate
  43.     return theta_vec, cost
  44.  
  45.  
  46.  
  47. if __name__ == '__main__':
  48.     input_filename = 'matlab/data.txt'
  49.     x_mtx, y_vec = getxy(input_filename)
  50.     nparams = len(x_mtx[0])
  51.     init_theta = [0 for _ in range(nparams)]
  52.     # init_theta = [-25, 0.2, 0.2] # nearly the right answer
  53.     init_cost, init_grad = cost_and_grad(x_mtx, y_vec, init_theta)
  54.     print(init_cost)
  55.     res_theta, res_cost = gradient_descent(x_mtx,y_vec, init_theta)
  56.     print(res_cost)
  57.     print(res_theta)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement