removing invalid character on windows
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
import numpy as np
|
||||
# Setting a random seed, feel free to change it and see different solutions.
|
||||
np.random.seed(42)
|
||||
|
||||
|
||||
# TODO: Fill in code in the function below to implement a gradient descent
|
||||
# step for linear regression, following a squared error rule. See the docstring
|
||||
# for parameters and returned variables.
|
||||
def MSEStep(X, y, W, b, learn_rate=0.005):
|
||||
"""
|
||||
This function implements the gradient descent step for squared error as a
|
||||
performance metric.
|
||||
|
||||
Parameters
|
||||
X : array of predictor features
|
||||
y : array of outcome values
|
||||
W : predictor feature coefficients
|
||||
b : regression function intercept
|
||||
learn_rate : learning rate
|
||||
|
||||
Returns
|
||||
W_new : predictor feature coefficients following gradient descent step
|
||||
b_new : intercept following gradient descent step
|
||||
"""
|
||||
|
||||
# compute errors
|
||||
y_pred = np.matmul(X, W) + b
|
||||
error = y - y_pred
|
||||
|
||||
# compute steps
|
||||
W_new = W + learn_rate * np.matmul(error, X)
|
||||
b_new = b + learn_rate * error.sum()
|
||||
return W_new, b_new
|
||||
|
||||
return W_new, b_new
|
||||
|
||||
|
||||
# The parts of the script below will be run when you press the "Test Run"
|
||||
# button. The gradient descent step will be performed multiple times on
|
||||
# the provided dataset, and the returned list of regression coefficients
|
||||
# will be plotted.
|
||||
def miniBatchGD(X, y, batch_size=20, learn_rate=0.005, num_iter=25):
|
||||
"""
|
||||
This function performs mini-batch gradient descent on a given dataset.
|
||||
|
||||
Parameters
|
||||
X : array of predictor features
|
||||
y : array of outcome values
|
||||
batch_size : how many data points will be sampled for each iteration
|
||||
learn_rate : learning rate
|
||||
num_iter : number of batches used
|
||||
|
||||
Returns
|
||||
regression_coef : array of slopes and intercepts generated by gradient
|
||||
descent procedure
|
||||
"""
|
||||
n_points = X.shape[0]
|
||||
W = np.zeros(X.shape[1]) # coefficients
|
||||
b = 0 # intercept
|
||||
|
||||
# run iterations
|
||||
regression_coef = [np.hstack((W, b))]
|
||||
for _ in range(num_iter):
|
||||
batch = np.random.choice(range(n_points), batch_size)
|
||||
X_batch = X[batch, :]
|
||||
y_batch = y[batch]
|
||||
W, b = MSEStep(X_batch, y_batch, W, b, learn_rate)
|
||||
regression_coef.append(np.hstack((W, b)))
|
||||
|
||||
return regression_coef
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# perform gradient descent
|
||||
data = np.loadtxt('data.csv', delimiter=',')
|
||||
X = data[:, :-1]
|
||||
y = data[:, -1]
|
||||
regression_coef = miniBatchGD(X, y)
|
||||
|
||||
# plot the results
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
plt.figure()
|
||||
X_min = X.min()
|
||||
X_max = X.max()
|
||||
counter = len(regression_coef)
|
||||
for W, b in regression_coef:
|
||||
counter -= 1
|
||||
color = [1 - 0.92 ** counter for _ in range(3)]
|
||||
plt.plot([X_min, X_max], [X_min * W + b, X_max * W + b], color=color)
|
||||
plt.scatter(X, y, zorder=3)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user