import numpy as np
import matplotlib.pyplot as plt
def plot(x,y,m,b):
    plt.scatter(x,y)
    # datapoints
    y_pred=[i*m+b for i in x]
    plt.plot(x,y) #classifier line
    plt.show()
    

def grad_desc(x,y):
    m_curr=b_curr=0  #starting value m_curr,b_curr
    iterations=1000  #Total iteration count
    learning_rate=0.001 #Assumed learning rate
    n=len(x)            #length of x vector
    for i in range(iterations):
        y_pred = m_curr*x + b_curr #predicted value of y
        md=(-2/n)*sum(x*(y-y_pred)) #value of derivative of cost w.r.t m
        cost=sum((y-y_pred)**2)/n
        bd=(-2/n)*sum(y-y_pred)     #value of derivative of cost w.r.t b
        m_curr=m_curr-learning_rate*md
        b_curr=b_curr-learning_rate*bd
        print('m {} b {} cost {}'.format(m_curr,b_curr,cost))
        plot(x,y,m_curr,b_curr)
if __name__=="__main__":
    x=np.array([2,3,4,5,6,7,8,9,11,10,12])
    y=np.array([7,10,13,16,19,22,25,28,34,31,37])
    grad_desc(x,y)