Độ dốc gốc là một thuật toán tối ưu hóa hoạt động bằng cách tìm kiếm hiệu quả không gian tham số, phần chặn[$\theta_0$] và độ dốc[$\theta_1$] cho hồi quy tuyến tính, theo quy tắc sau
\[\begin{aligned} \theta. = \theta -\alpha \frac{\delta}{\delta \theta}J[\theta]. \end{căn} \]Lưu ý rằng chúng tôi đã sử dụng '$. =$' để chỉ định hoặc cập nhật
\[J[\theta]\] được gọi là hàm chi phí và \[\alpha\] là tốc độ học tập, một tham số miễn phí. Trong hướng dẫn này, chúng ta sẽ sử dụng hàm chi phí bình phương nhỏ nhất được định nghĩa như sau
trong đó \[m\] là tổng số ví dụ huấn luyện và $h_\theta[x^{[i]}]$ là hàm giả thiết được định nghĩa như sau
\[\begin{aligned} h_\theta[x^{[i]}] = \theta_0 + \theta_1 x^{[i]} \end{aligned} \]trong đó siêu tập lệnh $[i]$ được sử dụng để biểu thị mẫu $i^{th}$ [chúng tôi sẽ lưu các chỉ số con cho chỉ mục vào một tính năng khi chúng tôi xử lý nhiều tính năng]
Chúng ta cần đạo hàm cho cả $\theta_0$ và $\theta_1$
Đoạn mã sau chạy cho đến khi nó hội tụ hoặc đạt đến số lần lặp tối đa. Chúng tôi nhận được $\theta_0$ và $\theta_1$ là đầu ra của nó
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]]] # 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 # mean squared error e = sum[ [ [t0 + t1*x[i] - y[i]]**2 for i in range[m]] ] if abs[J-e]