一、梯度下降算法求解二元一次方程
- 问题描述
- 求解y=w∗x+b+epsy = w*x+b + epsy=w∗x+b+eps最小值
- 给出x,y的大量测试点,预测出w和b
- 步骤
- 将方程式转化为loss=(w∗x+b)2loss=(w*x+b)^2loss=(w∗x+b)2,由于有大量的测试点,可以求出loss的均值avg来表示。(这就是求解loss函数的式子)
- 求梯度信息
1. w′=w−lr∗∇loss∇ww' = w - lr * \frac{\nabla loss}{\nabla w}w′=w−lr∗∇w∇loss(lr是learningRate学习率)
2. b′=b−lr∗∇loss∇bb' = b - lr * \frac{\nabla loss}{\nabla b}b′=b−lr∗∇b∇loss - 给定迭代次数来求取目标解[b,w]
- code
import numpy as np
def compute_error_for_line_given_points(b,w,points):
totalError = 0
for i in range(0,len(points)):
x = points[i,0]
y = points[i,1]
totalError += (w * x + b - y) ** 2
return totalError / float(len(points))
def step_gradient(b_current,w_current,points,learningRate):
b_gradient = 0
w_gradient = 0
N = float(len(points))
for i in range(0,N):
x = points[i,0]
y = points[i,1]
w_gradient += (2/N) * (w_current * x + b_current - y) * x
b_gradient += (2/N) * (w_current * x + b_current - y)
new_b = b_current - (learningRate * b_gradient)
new_w = w_current - (learningRate * w_gradient)
return [new_b,new_w]
def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):
b = starting_b
w = starting_w
for i in range(num_iterations):
b,w = step_gradient(b,w,np.array(points),learning_rate)
return [b,w]