引言
对于机器学习的回归问题,这里我不做多介绍,网上博客介绍很多,这里我重在数学公式和实现过程
原理
场景
对于一个回归问题,寻找一个线性模型来很好的拟合样本,且设这个线性模型函数为
$$w * x + b$$
这里的x不一定是一个数 有可能是一个矩阵
数学推导
有过机器学习的基础的应该知道,这个模型的loss函数为
$$loss = \sum_i{(w * x_{i} + b - y_{i})}^2$$
使用梯度下降法:
$$w’ = w - lr * \frac{\mathrm{𝜕}loss}{\mathrm{𝜕}w}$$
$$b’ = w - lr * \frac{\mathrm{𝜕}loss}{\mathrm{𝜕}b}$$
计算梯度后的y值
$$w’ * x + b’ → y$$
算法python实现
Step1:Compute loss
def computer_error(w, b, points):
# 总误差
totalError = 0
for i in range(len(points)):
x = points[i, 0]
y = points[i, 1] # 真实值
totalError += ((w * x + b) - y)**2
return totalError / float(len(points))
Step2:Compute Gradient and update
def step_gradient(b_current, w_current, points, learingRate):
b_gradient = 0
w_gradient = 0
N = float(len(points))
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
# 对loss求b的偏导
b_gradient += (2/N) * ((w_current * x + b_current) - y)
# 对loss求w的偏导
w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
# 更新 w 和 b
new_b = b_current - (learingRate * b_gradient)
new_w = w_current - (learingRate * w_gradient)
return [new_b, new_w]
Step3:Set w=w’ b = b’ and loop
def gradient_descent_runner(points, starting_b, starting_w, learningRate, num_iteration):
b = starting_b
w = starting_w
# 进行num_iteration次梯度下降
for i in range(num_iteration):
b, w = step_gradient(b, w, np.array(points), learningRate)
return [b, w]
有疑问 可以在博客下面留言