# y = mx + b # m is slope, b is y-intercept def computeErrorForLineGivenPoints(b, m, points): totalError = 0 for i in range(0, len(points)): x = points[i, 0] y = points[i, 1] totalError += (y - (m * x + b)) ** 2 return totalError / float(len(points)) def stepGradient(b_current, m_current, points, learningRate): b_gradient = 0 m_gradient = 0 N = float(len(points)) for i in range(0, len(points)): x = points[i, 0] y = points[i, 1] b_gradient += -(2/N) * (y - ((m_current * x) + b_current)) m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current)) new_b = b_current - (learningRate * b_gradient) new_m = m_current - (learningRate * m_gradient) return [new_b, new_m] import random from numpy.random import randn from numpy import * import pandas as pd import matplotlib.pyplot as plt random.seed(100) n = 100 x = randn(n) * 10 + 50 y = x * 1.5 + randn(n) * 10 points = array([x, y]).transpose() b = 0 m = 0 for i in range(100): b, m = stepGradient(b, m, array(points), 0.02) if i % 10 == 0: print b, m, computeErrorForLineGivenPoints(b, m, points) # plt.scatter(x, y) # plt.plot(arange(0,100), m*arange(0,100)+b) # plt.show()