利用梯度下降 Gradient Descent 求解線性回歸

代碼示例來自 Udacity 課程中 Siraj 的一個教學視頻,版權歸屬于原作者及 Udacity 所有,源代碼及數據源可見 Siraj 的 Github,盡管代碼可以直接下載,我還是選擇跟隨視頻手動完成的方式,也對于引用方式和變量命名做了一點修改,放在這里方便隨時查看。

這個代碼示例主要是為了演示梯度下降的實現過程,用它來求解線性回歸稍微有些大材小用,但不妨礙說明問題。

import numpy as np

def compute_error_for_points(b, m, points):
    total_error = 0
    for i in range(len(points)):
        x = points[i, 0]
        y = points[i, 1] 
        total_error += (y - (m * x + b)) ** 2
    return total_error / float(len(points))

def step_gradient(b_current, m_current, points, learning_rate):
    # core gradient descent computation
    b_gradient = 0
    m_gradient = 0
    N = float(len(points))
    for i in range(len(points)):
        x = points[i, 0]
        y = points[i, 1]
        b_gradient += -(2 / N) * (y - (m_current * x + b_current))
        m_gradient += -(2 / N) * x * (y - (m_current * x + b_current))
    new_b = b_current - learning_rate * b_gradient
    new_m = m_current - learning_rate * m_gradient
    return [new_b, new_m]

def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m

    for i in range(num_iterations):
        b, m = step_gradient(b, m, np.array(points), learning_rate) 
    return [b, m]

def run():
    points = np.genfromtxt('data.csv', delimiter=',') 

    # hyperparameters
    learning_rate = 0.0001

    # y = mx + b
    initial_b = 0
    initial_m = 0
    num_iterations = 1000
    [b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)
    print(b)
    print(m)


if __name__ == '__main__':
    run()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容