import numpy as np
from numpy import array
import matplotlib.pyplot as plt

def computer_error_for_given_points(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 step_gradient(b_current,m_current, points, learningRate):
    #Gradient Descent
    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]

def gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iterations):
    b = starting_b
    m = starting_m

    for i in range(num_iterations):
        b, m = step_gradient(b, m, array(points), learning_rate)
    return[b, m]


def run():
    points = np.genfromtxt('data.csv',delimiter=',')
    #hyperparameter
    learning_rate=0.0001 
    #y=mx+b , (slope=m)
    initial_b = 0
    initial_m = 0
    num_iterations = 1000 #small dataset 1000 should be fine
    [b, m]= gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)
    print(b)
    print(m)

    

if __name__=='__main__':
    run()