2.Tensorflow实现线性回归
实现一个算法一般分为三个步骤:
1.找到这个算法的预测函数,比如线性回归的预测函数形式为$y = wx+b$
2.找到这个算法的损失函数,比如线性回归的损失函数是mse最小二乘法
3.找到让损失函数最小时的系数$w$和$b$,一般采用梯度下降法
使用tensorflow实现算法的基本步骤:
1.使用tensorflow中的变量将算法的预测函数、损失函数定义出来
2.使用梯度下降法优化器求解损失函数最小时的系数
3.分批次的将数据传给优化器,找到最佳参数
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from sklearn.linear_model import LinearRegression
#生成线性数据
x = np.linspace(0,10,20)+ np.random.randn(20)
y = np.linspace(0,10,20)+ np.random.randn(20)
#初始化w和b
w = tf.Variable(np.random.randn()*0.02)
b = tf.Variable(0.)
#定义预测函数
def linear_regression(x):
return w * x + b
#定义损失函数
def mean_square_loss(y_pred,y_true):
return tf.reduce_mean(tf.square((y_true - y_pred)))
#优化器
optimizer = tf.optimizers.SGD()
#定义优化过程
def run_optimizer():
#梯度带
with tf.GradientTape() as g:
pred = linear_regression(x)
loss = mean_square_loss(pred,y)
#计算梯度
gradients = g.gradient(loss,[w,b])
#更新w,b
optimizer.apply_gradients(zip(gradients,[w,b]))
#训练函数
for i in range(5000):
run_optimizer()
#展示结果
if i %100 == 0:
pred = linear_regression(x)
loss = mean_square_loss(pred,y)
print(f'step:{i},loss:{loss},w:{w.numpy()},b:{b.numpy()}')
结果:
step:0,loss:1.4280287027359009,w:0.8572379350662231,b:0.11684638261795044
step:100,loss:1.257596731185913,w:0.9460423588752747,b:-0.12140487134456635
step:200,loss:1.230806589126587,w:0.9695827960968018,b:-0.28233101963996887
step:300,loss:1.2193398475646973,w:0.9849836230278015,b:-0.3876136839389801
step:400,loss:1.2144322395324707,w:0.9950593113899231,b:-0.45649266242980957
step:500,loss:1.2123314142227173,w:1.0016510486602783,b:-0.5015550851821899
step:600,loss:1.2114322185516357,w:1.005963683128357,b:-0.5310364365577698
...
...
step:4500,loss:1.2107594013214111,w:1.0141221284866333,b:-0.5868095755577087
step:4600,loss:1.2107594013214111,w:1.0141221284866333,b:-0.5868095755577087
step:4700,loss:1.2107594013214111,w:1.0141221284866333,b:-0.5868095755577087
step:4800,loss:1.2107594013214111,w:1.0141221284866333,b:-0.5868095755577087
step:4900,loss:1.2107594013214111,w:1.0141221284866333,b:-0.5868095755577087
与sklearn线性回归对比:
linear_model = LinearRegression()
linear_model.fit(x.reshape(-1,1),y)
#绘制图像
plt.scatter(x,y)
x_test = np.linspace(0, 10, 20).reshape(-1, 1)
plt.plot(x_test,w.numpy() * x_test + b.numpy(),c = 'r',lw = 10,alpha = 0.5,label = 'tensorflow')
plt.plot(x_test,linear_model.coef_ * x_test + linear_model.intercept_,c = 'g',label = 'sklearn')
plt.grid(True)
plt.legend()
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/956ff527103c5063c6d1ca325c8f11ff.png)