3.2 线性回归
让我们从创建一些模拟数据开始进入线性回归的核心部分。创建一个名为regression.py的Python文件,按照清单3.1初始化数据。代码将产生类似图3.5的输出。
图3.5 y=x+(噪声)的散点图
清单3.1 可视化原始输入
现在你有了一些可用的数据点,你可以尝试对它们拟合一条直线。至少,你需要为TensorFlow提供每个候选参数的得分。确定得分的通常被称为代价函数。得分越高说明模型的参数越差。如果最佳拟合曲线是y=2x,选择2.01为参数的代价较低,而选择-1为参数的代价则较高。
当转化为最小化代价函数的问题之后,如图3.6所示,TensorFlow负责背后的工作,尝试以一种有效的方式更新参数,并最终达到可能的最佳值。将你所有的数据遍历完一次以更新参数,称为一个epoch。
图3.6 寻找参数w使代价最优。代价定义为理想值与模型实际输出之间的误差的范数。最后,实际输出是根据模型的函数计算的
在本例中,你用误差的总和来定义代价。预测x的误差通常是计算实际值f(x)和预测值M(w, x)的平方差。因此,代价为实际值与预测值的平方差之和,如图3.7所示。
图3.7 代价是模型输出和实际值之间差的范数
将前面的代码更新为清单3.2的样子。此代码定义了代价函数并要求TensorFlow运行优化器来找到模型参数的最优解。
清单3.2 求解线性回归
如图3.8所示,你刚刚使用TensorFlow完成了线性回归!另外,回归算法中的其他主题与清单3.2的代码差别不大,这很方便。整个流程涉及通过TensorFlow更新模型参数,如图3.9所示。
图3.8 运行清单3.2得到的线性回归估计
图3.9 学习算法更新模型参数来最小化给定的代价函数
现在你已经学习了如何在TensorFlow中实现一个简单的回归模型。如前所述,要进一步改进模型只需要适当地调整偏差和方差之间的权衡。到目前为止,你的模型有较大的偏差,它只表达了一组有限的函数,如线性函数。在3.3节中,你会尝试一个更复杂的模型。你会发现只有TensorFlow图需要重新连接,其他所有事情(如预处理、训练和评估)都保持不变。