import numpy as np import random import sklearn from sklearn.datasets.samples_generator import make_regression import pylab from scipy import stats def gradient_descent(alpha, x, y, ep=0.0001, max_iter=10000): converged = False iter = 0 m = x.shape[0] # number of samples # initial theta t0 = np.random.random(x.shape[1]) t1 = np.random.random(x.shape[1]) # total error, J(theta) J = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)]) p = 1 # Iterate Loop while not converged: # for each training sample, compute the gradient (d/d_theta j(theta)) grad0 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) for i in range(m)]) grad1 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) * x[i] for i in range(m)]) # update the theta_temp temp0 = t0 - alpha * grad0 temp1 = t1 - alpha * grad1 # update theta t0 = temp0 t1 = temp1 for i in range(x.shape[0]): y_predict = t0 + t1 * x if (p % 100 == 0): print (p) pylab.plot(x, y, 'o') pylab.plot(x, y_predict, 'k-') pylab.show() p=p+1 # mean squared error e = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)]) if abs(J - e) <= ep: print ('Converged, iterations: ', iter, '!!!') converged = True J = e # update error iter += 1 # update iter if iter == max_iter: print ('Max interactions exceeded!') converged = True return t0, t1 if __name__ == '__main__': x, y = make_regression(n_samples=100, n_features=1, n_informative=1, random_state=0, noise=35) print ('x.shape = %s y.shape = %s' % (x.shape, y.shape)) alpha = 0.01 # learning rate ep = 0.01 # convergence criteria # call gredient decent, and get intercept(=theta0) and slope(=theta1) theta0, theta1 = gradient_descent(alpha, x, y, ep, max_iter=1000) print ('theta0 = %s theta1 = %s' % (theta0, theta1)) # check with scipy linear regression slope, intercept, r_value, p_value, slope_std_error = stats.linregress(x[:, 0], y) print ('intercept = %s slope = %s' % (intercept, slope)) # plot for i in range(x.shape[0]): y_predict = theta0 + theta1 * x pylab.plot(x, y, 'o') pylab.plot(x, y_predict, 'k-') pylab.show() print ("Done!")