How do you make this code more pythonic?

machine-learning, python, scipy

Solution

x = matrix([[0.],[0],[1]])
theta = matrix(zeros([3,1]))
for i in range(5):
  grad = matrix(zeros([3,1]))
  hess = matrix(zeros([3,3]))
  [xfile, yfile] = [open('q1'+a+'.dat', 'r') for a in 'xy']
  for xline, yline in zip(xfile, yfile):
    x.transpose()[0,:2] = [map(float, xline.split("  ")[1:3])]
    y = float(yline)
    hypoth = 1 / (1 + math.exp(theta.transpose() * x))
    grad += (y - hypoth) * x
    hess -= hypoth * (1 - hypoth) * x * x.transpose()
  theta += inv(hess) * grad
print "done"
print theta

Problem

Could you guys please tell me how I can make the following code more pythonic? The code is correct. Full disclosure - it's problem 1b in Handout #4 of this machine learning course. I'm supposed to use newton's algorithm on the two data sets for fitting a logistic hypothesis. But they use matlab & I'm using scipy Eg one question i have is the matrixes kept rounding to integers until I initialized one value to 0.0. Is there a better way? Thanks ``` import os.path import math from numpy import matrix from scipy.linalg import inv #, det, eig x = matrix( '0.0;0;1' ) y = 11 grad = matrix( '0.0;0;0' ) hess = matrix('0.0,0,0;0,0,0;0,0,0') theta = matrix( '0.0;0;0' ) # run until convergence=6or7 for i in range(1, 6): #reset grad = matrix( '0.0;0;0' ) hess = matrix('0.0,0,0;0,0,0;0,0,0') xfile = open("q1x.dat", "r") yfile = open("q1y.dat", "r") #over whole set=99 items for i in range(1, 100): xline = xfile.readline() s= xline.split(" ") x[0] = float(s[1]) x[1] = float(s[2]) y = float(yfile.readline()) hypoth = 1/ (1+ math.exp(-(theta.transpose() * x))) for j in range(0,3): grad[j] = grad[j] + (y-hypoth)* x[j] for k in range(0,3): hess[j,k] = hess[j,k] - (hypoth *(1-hypoth)*x[j]*x[k]) theta = theta - inv(hess)*grad #update theta after construction xfile.close() yfile.close() print "done" print theta ```

Original source