本文阅读预计用时:15分钟
主要阐述如何运用Tensorflow2.2进行线性回归处理
这个专栏主要对64位mac上的Tensorflow2.2的使用进行探索。在本专栏的第一篇文章中,笔者列举了几个对于Tensorflow使用者而言比较清晰的学习网站,有兴趣的学习者可以去自行探索。不同角度学习Tensorflow的途径还有很多,笔者在此就不一一详述。
- 引语
在本专栏的上篇文章中讲述了如何运用Tensorflow2对于多变量函数
- 深入
1.1 线性回归的概念
对连续型变量做预测叫回归,线性回归即找到一个从特征空间X到输出空间Y的最优的线性映射的函数。
1.2 线性回归的算法
换言之,我们对数据做线性回归处理的意义是为了找到函数
这里我们可以使用均方误差确定w和b。作为一种损失函数(Loss Function),均方误差是回归任务中最常用的性能度量。
因此,我们试图找到参数
在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。求解w和b使上面公式最小化的过程,称为线性回归模型的最小二乘“参数估计”(parameter estimation)。为了得出达到
令
得出
即为w和b最优解,使得均方误差
1.3 Tensorflow中的线性回归
我们希望通过对该数据集进行线性回归,即使用线性模型
对于多元函数
- 初始化自变量为
- 迭代进行下列步骤直到满足收敛条件:
- 求函数
关于自变量的梯度
- 更新自变量:
。这里是学习率(即梯度下降一次迈出的 “步子” 大小)
-
接下来我们考虑使用程序来实现梯度下降,求线性回归
1.3.1 线性回归的运用
考虑一个实际问题,某城市在 2016 年 - 2020 年的房价如下表所示:
现在,我们希望通过对该数据进行线性回归,设对上述数据有线性拟合函数
首先,为了提升模型的收敛速度,我们对数据进行归一化(Normalization)处理。
import
接下来,我们使用梯度下降方法来求线性模型中两个参数
X = tf.constant(X)
y = tf.constant(y)
a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a, b]
num_epoch = 10000
optimizer = tf.keras.optimizers.SGD(learning_rate=5e-4)
# 定义随机梯度下降法中的优化器和学习率
for e in range(num_epoch):
# 使用tf.GradientTape()记录损失函数的梯度信息
with tf.GradientTape() as tape:
y_pred = a * X + b
loss = tf.reduce_sum(tf.square(y_pred - y))
# TensorFlow自动计算损失函数关于自变量(模型参数)的梯度
grads = tape.gradient(loss, variables)
# TensorFlow自动根据梯度更新参数
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
print(a, b)
使用梯度下降法反复迭代后,我们得到线性模型中两个参数
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=0.9324755> <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-0.102291904>
因此,
最后,我们使用matplotlib把归一化的数据集和得到的线性拟合函数绘制在图2中的坐标系里
通过对于某城市房价的变化进行线性回归,我们不仅可以了解某城市之前的房价变化,也可以根据这个趋势预测某城市未来的房价变化。
- 结语
这篇主要对于对于Tensorflow的线性回归和梯度下降法进行了介绍,将最小二乘法从理论表达上转化到代码中的实现。
使用tape.gradient(ys, xs)自动计算梯度并使用optimizer.apply_gradients(grads_and_vars)自动更新模型参数是梯度下降法的两个重点,优化器可以帮助我们根据计算出的求导结果更新模型参数,从而最小化某个特定的损失函数。此外,我会在我的另外一个专栏里的下篇文章具体介绍损失函数,如果对损失函数有兴趣的同学欢迎关注我的另一个专栏。
- 参考资料:
https://tf.wiki/zh_hans/basic/basic.html#zh-hans-automatic-derivation
PS:鄙人不才,欢迎各位大佬指正!如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!