Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. # TODO: shuffle dataset before gradient descent?
  2.  
  3. # import random libraries
  4. from random import random, shuffle
  5.  
  6. # this function scales down from [0,1) to [0,0.16) in order to reduce the amount of "wobble"
  7. def rand():
  8. return random()/6
  9.  
  10. # main regressor class
  11. class Regressor(object):
  12. # requires us to give an interval of test values and slope and y-intercept values
  13. def __init__(self, m, b, interval):
  14. self.dataset = {}
  15. self.theta = [rand(), rand()]
  16. for x in xrange(interval[0], interval[1]):
  17. self.dataset[x] = (m+rand())*x+(b+rand())
  18. self.length = len(self.dataset)
  19. print "Regressor instantiated, dataset generated"
  20.  
  21. # calling the regressor on a real number returns the y-value for that point
  22. def __call__(self, x):
  23. return self.theta[0] + self.theta[1]*x
  24.  
  25. # loss function uses squaring for simple differentiation
  26. # shows numerical error in estimate
  27. def loss(self):
  28. sum = 0
  29. for x, y in self.dataset.iteritems():
  30. sum += pow(y-self(x),2)
  31. return sum / (2*self.length)
  32.  
  33. # gradient descent is used to minimize the error by adjusting weights/parameters
  34. # uses partial derivative formula and learning rate alpha, completing given number of steps
  35. def gradientDescent(self, alpha=0.01, steps=1000):
  36. print "Beginning gradient descent"
  37. alpha /= self.length
  38. for n in xrange(steps):
  39. if n % (steps/4) == 0:
  40. print "Completed {} steps; loss: {}".format(steps/4, self.loss())
  41. sum0 = 0
  42. sum1 = 0
  43. for x, y in self.dataset.iteritems():
  44. sum0 += self(x)-y
  45. sum1 += x*(self(x)-y)
  46. self.theta[0] -= alpha*sum0
  47. self.theta[1] -= alpha*sum1
  48. print "Gradient descent complete, parameters adjusted"
  49.  
  50. if __name__ == "__main__":
  51. r = Regressor(3, 4, (1,20))
  52. r.gradientDescent(0.01, 1000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement