线性回归模型可以算的上是机器学习中最简单的模型。这里的线性回归与统计学中所述的别无二致。在数据量比较小的情况下,我们可以使用高斯的最小二乘法来直接算出解析解。但是,在大数据时代,要进行回归的数据点量级非常巨大,难以一次性计算出结果。在这种情况下,可以使用梯度下降的方法迭代计算,不断逼近其最优解。
事实上,从线性回归这个最简单的模型就可以看出机器学习中监督学习(Supervised Learning)建模的常见思路:
-
定义一个模型,也就是一个计算式,来表达输入 与输出 的关系。比如线性回归模型:。学习的过程就是不断更新参数 和 的过程。
-
设置一个代价函数,表征当前的参数 和 有多”好”。比较常用的函数是均方误差(MSE)函数:
-
用梯度下降法(Gradient Descent)来优化代价函数 。
如果全部手写计算过程的话,我们需要自己求出导数来进行梯度下降过程。而使用 TensorFlow 这个框架的目的,就是想要让它能够自动完成这个过程。接下来就用 TensorFlow 来实现线性回归(Jupyter Notebook 格式的源代码可以访问我的 GitHub 仓库下载):
-
导入库 numpy 与 tensorflow:
import numpy as np import tensorflow as tf -
读入数据。方便起见,这里直接定义了四个数据点 (1,2) (2,3) (3,4) (4,5),不难看出, 和 的最优参数均为 1。
data_X = np.array([1, 2, 3, 4]) data_Y = 1 * data_X + 1 -
定义模型
def model(W, b, X): return W * X + b -
将参数 定义成变量,输入数据 和输出数据 定义成占位符:
W = tf.Variable([.1], dtype=tf.float32) b = tf.Variable([.1], dtype=tf.float32) X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32) -
定义表示模型输出值的变量
Y_hat,以及代价函数 。其中,使用 MSE 作为代价函数。另外,选用梯度下降优化器,学习率为 0.01。设定代价函数 为优化器的优化目标。Y_hat = model(W, b, X) J = tf.reduce_sum(tf.square(Y - Y_hat)) optimizer = tf.train.GradientDescentOptimizer(0.01) train_step = optimizer.minimize(J) -
执行训练过程。先初始化所有的变量,然后训练 1000 次,最后输出 和 :
with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): sess.run(train_step, {X: data_X, Y: data_Y}) print(sess.run(W), sess.run(b))
输出结果为 [ 1.00000095] [ 0.99999702],可以看出,这个训练过程是正确的。
不难看出,TensorFlow 简化了编写机器学习算法最难的一步:梯度下降优化。只需要定义出模型和代价函数,剩下的事情就可以交给 TensorFlow 来完成了。