原理和思路都很简单,不多说,上代码。
import numpy as np
class GradientDescent(object):
def __init__(self, data_file, learning_rate=0.0001, iterations=1000):
self.learning_rate = learning_rate
self.points = np.genfromtxt(data_file, delimiter=',')
self.loss = 0
self.b = 0
self.w = 0
self.iterations = iterations
self.main()
def main(self):
self.compute_loss()
print('Starting gradient descent at b = {}, w = {} with the initial loss = {}'
.format(self.b, self.w, self.loss))
self.gradient_descent()
self.compute_loss()
print('After {} iterations, ending gradient descent at b = {}, w = {} with the final loss = {}'
.format(self.iterations, self.b, self.w, self.loss))
def compute_loss(self):
self.loss = 0
for point in self.points:
x, y = point[0], point[1]
self.loss += (y - (self.w * x + self.b)) ** 2
self.loss /= len(self.points)
def gradient_descent(self):
print('Running...')
for iteration in range(self.iterations):
b_gradient = 0
w_gradient = 0
n = len(self.points)
for point in self.points:
x, y = point[0], point[1]
b_gradient += -(2 / n) * (y - ((self.w * x) + self.b))
w_gradient += -(2 / n) * x * (y - ((self.w * x) + self.b))
self.w -= self.learning_rate * w_gradient
self.b -= self.learning_rate * b_gradient
if __name__ == '__main__':
gd = GradientDescent('data.csv')