Created
June 17, 2018 12:25
-
-
Save sarath-soman/bfeffb28a4273353a9dd7c891b11945b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
""" | |
Linear regression learning algorithm | |
""" | |
class LinearRegression: | |
def train(self, x, y): | |
""" | |
Trains a linear model from the data set | |
Args: | |
x -> independent variable matrix | |
y -> dependent variable column vector | |
Return: | |
List of learn co-efficients | |
""" | |
#Augmenting idv with constant intercept value | |
for xi in x: | |
xi.insert(0, 1) | |
no_idv = len(x[0]) | |
#Todo: make it a hyper param | |
alpha = 0.001 | |
#Todo: randomization | |
theta = [0] * no_idv | |
theta_temp = [t for t in theta] | |
#Convergence criteria is -> iterating 100000 times, this is for the sake of impl | |
for j in range(0, 100000): | |
for i in range(0, no_idv): | |
theta[i] = theta_temp[i] - alpha * self._partial_diff(theta_temp, x, y, i) | |
theta_temp = [t for t in theta] | |
return theta | |
def _partial_diff(self, theta, x, y, index): | |
""" | |
Computes the paritial differentiation of htheta | |
Args: | |
theta -> coefficients row vector | |
x -> independent variable matrix | |
y -> dependent variable column vector | |
index -> coefficient term being differentiated | |
Return: | |
updated coefficient at given 'index' | |
""" | |
no_idv = len(x[0]) | |
m = len(x) | |
sigma = 0.0 | |
for i in range(0, m): | |
htheta = self._htheta(theta, x, i) | |
sigma = sigma + (htheta - y[i][0]) * x[i][index] | |
return sigma / m | |
def _htheta(self, theta, x, index): | |
""" | |
htheta function computation | |
Args: | |
theta -> coefficient row vector | |
x -> independent variable matrix | |
index -> row index of x | |
""" | |
no_idv = len(x[0]) | |
htheta = 0.0 | |
for i in range(0, no_idv): | |
htheta = htheta + theta[i] * x[index][i] | |
return htheta | |
def main(): | |
regression = LinearRegression() | |
#y = 2 + x | |
x = [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]] | |
y = [[3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13]] | |
thetas = regression.train(x, y) | |
print(thetas) | |
for xi in x: | |
htheta = thetas[0] * 1 + thetas[1] * xi[1] | |
print("{xi} -> {htheta}".format(xi=xi[1], htheta=htheta)) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment