[Batch] Thuật toán giảm độ dốc
Tìm kiếm trang web Bogotobogo.com:
[Batch] Thuật toán giảm độ dốc
GROGHIENT DECTENT 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ố, chặn [$ \ theta_0 $] và độ dốc [$ \ theta_1 $] cho hồi quy tuyến tính, theo quy tắc sau:
\] \ end {căn chỉnh} \]
Lưu ý rằng chúng tôi đã sử dụng '$: = $' để biểu thị một gán hoặc cập nhật.
\ [J [\ theta] \] được gọi là hàm chi phí và \ [\ alpha \] là tỷ lệ học tập, một tham số miễn phí. Trong hướng dẫn này, chúng tôi sẽ sử dụng hàm chi phí bình phương tối thiểu được xác định như sau:
\] }]^2, \ end {căn chỉnh} \]
Trong đó \ [m \] là tổng số ví dụ đào tạo và $ h_ \ theta [x^{[i]}] $ là hàm giả thuyết được xác định như thế này:
\]
trong đó Super Script $ [i] $ được sử dụng để biểu thị mẫu $ i^{th} $ [chúng tôi sẽ lưu các chỉ số 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 tôi cần các dẫn xuất cho cả $ \ theta_0 $ và $ \ theta_1 $:
\ [\ started {Aligned} \ frac {\ partial} {\ partial \ theta_0} j [\ theta_0, \ theta_1] x^{[i]}]-y^{[i]}] \ end {căn chỉnh} \] \ [\ start \ theta_0 + \ theta_1 x^{[i]}-y^{[i]}] \ end {Aligned} \] \ [\ start theta_0, \ theta_1] = \ frac {1} {m} \ sum_ {i = 1}^m [h_ \ theta [x^{[i]}]-y^{[i]}] ]} \ end {Align} \] \ [\ start {[i]}] x^{[i]} \ end {căn chỉnh} \]
Mã a
Mã sau chạy cho đến khi nó hội tụ hoặc đạt được tối đa. Chúng tôi nhận được $ \ theta_0 $ và $ \ theta_1 $ làm đầ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]