# 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()