TensorFlow2_200729系列---3、梯度下降求简单线性回归实例 TensorFlow2_200729系列---3、梯度下降求简单线性回归实例

一、总结

一句话总结:

梯度下降:梯度下降是对loss函数做的,对loss的w和b,比如w = w - learningRate*loss对w的梯度
画动态图:在动态图中更新y轴数据即可,如果需要更新text标注,那就也更新
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from matplotlib import pylab
%pylab

fig,ax=plt.subplots()

# 画散点图
x = data.iloc[:,0]
y = data.iloc[:,-1]
ax.scatter(x,y)

# 画直线图

line,=ax.plot(x,0*x+0)
# 存这个text1,方便动画的时候修改
text1 = ax.text(30,110,"w=0.0000,b=0.0000", fontdict={'size':16,'color':'r'})

def animate(i): 
    text1.set_text('w=%.4f,b=%.4f' %(bw_list[i][1],bw_list[i][0]))
    line.set_ydata(bw_list[i][1]*x+bw_list[i][0])
    return line,

def init(): 
    line.set_ydata(0*x+0)
    return line,

ani=animation.FuncAnimation(fig=fig,func=animate,frames=999,init_func=init,interval=5,blit=False)
ani.save('line_model.gif', writer='imagemagick', fps=30)
plt.show()

1、梯度下降为什么会在极值点那里收敛?

因为极值点处斜率(梯度)为0,这样学习率*梯度也是0

2、梯度下降中为什么乘上步长?

不乘上步长,有些情况下,导数太大了

3、matplotlib画动态图如何更新文本标注?

text1 = ax.text(30,110,"w=0.0000,b=0.0000", fontdict={'size':16,'color':'r'})
text1.set_text('w=%.4f,b=%.4f' %(bw_list[i][1],bw_list[i][0]))

4、matplotlib画动态图?

主要是初始化函数和更新函数,在更新函数中更新y数据:line.set_ydata(bw_list[i][1]*x+bw_list[i][0])

5、本题梯度下降核心代码(和公式推导一样)?

grad_b = 2(wx+b-y):b_gradient += (2/N) * ((w_current * x + b_current) - y)
grad_w = 2(wx+b-y)*x:w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
def step_gradient(b_current, w_current, points, learningRate):
    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]
        # grad_b = 2(wx+b-y)
        b_gradient += (2/N) * ((w_current * x + b_current) - y)
        # grad_w = 2(wx+b-y)*x
        w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
    # update w'
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]

6、本题损失函数最小二乘法实例?

totalError += (y - (w * x + b)) ** 2
# y = wx + b
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]
        # computer mean-squared-error
        totalError += (y - (w * x + b)) ** 2
    # average loss for each point
    return totalError / float(len(points))

二、梯度下降求简单线性回归实例

博客对应课程的视频位置:

In [1]:
import numpy as np


# data = []
# for i in range(100):
# 	x = np.random.uniform(3., 12.)
# 	# mean=0, std=0.1
# 	eps = np.random.normal(0., 0.1)
# 	y = 1.477 * x + 0.089 + eps
# 	data.append([x, y])
# data = np.array(data)
# print(data.shape, data)

# y = wx + b
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]
        # computer mean-squared-error
        totalError += (y - (w * x + b)) ** 2
    # average loss for each point
    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, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # grad_b = 2(wx+b-y)
        b_gradient += (2/N) * ((w_current * x + b_current) - y)
        # grad_w = 2(wx+b-y)*x
        w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
    # update w'
    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
    # update for several times
    for i in range(num_iterations):
        b, w = step_gradient(b, w, np.array(points), learning_rate)
    return [