1 import math
2 import numpy as np
3 x_train = np.array([1.0, 2.0, 3.0])
4 y_train = np.array([300.0, 350.0, 500])
5
6 def compute_cost(x, y, w, b):
7 m = x.shape[0]
8 f_wb = w * x + b
9 cost = ((f_wb - y) ** 2).sum()
10 total_cost = cost / (2 * m)
11 return total_cost
12
13 def compute_gradient(x, y, w, b):
14 m = x.shape[0]
15 dj_dw, dj_db = 0, 0
16
17 for i in range(m):
18 f_wb = w * x[i] + b
19 dj_dw_i = (f_wb - y[i]) * x[i]
20 dj_db_i = f_wb - y[i]
21 dj_db += dj_db_i
22 dj_dw += dj_dw_i
23 dj_dw = dj_dw / m
24 dj_db = dj_db / m
25
26 return dj_dw, dj_db
27
28 def gradient_descent(x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function):
29
30 b = b_in
31 w = w_in
32
33 for i in range(num_iters):
34 dj_dw, dj_db = gradient_function(x, y, w , b)
35 b = b - alpha * dj_db
36 w = w - alpha * dj_dw
37 cost = cost_function(x, y, w , b)
38
39 if i% math.ceil(num_iters/10) == 0:
40 print(f"Iteration {i}: Cost {cost:.2f}, Gradient (dw: {dj_dw:.3f}, db: {dj_db:.3f}), Parameters (w: {w:.3f}, b: {b:.5f})")
41
42 return w, b
43
44 w_init = 0
45 b_init = 0
46
47 iterations = 1000
48 tmp_alpha = 0.001
49
50 w_final, b_final= gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha,
51 iterations, compute_cost, compute_gradient)
52
53 print(f"(w,b) found by gradient descent: ({w_final:8.4f},{b_final:8.4f})")