Skip to content
Mo's Blog
Go back

TensorFlow实战1:线性回归(Linear Regression)

机器学习, tensorflow

线性回归模型可以算的上是机器学习中最简单的模型。这里的线性回归与统计学中所述的别无二致。在数据量比较小的情况下,我们可以使用高斯的最小二乘法来直接算出解析解。但是,在大数据时代,要进行回归的数据点量级非常巨大,难以一次性计算出结果。在这种情况下,可以使用梯度下降的方法迭代计算,不断逼近其最优解。

事实上,从线性回归这个最简单的模型就可以看出机器学习中监督学习(Supervised Learning)建模的常见思路:

  1. 定义一个模型,也就是一个计算式,来表达输入 xx 与输出 yy 的关系。比如线性回归模型:y=wx+by = wx + b。学习的过程就是不断更新参数 wwbb 的过程。

  2. 设置一个代价函数,表征当前的参数 wwbb 有多”好”。比较常用的函数是均方误差(MSE)函数:

    J(w,b)=12mi=1m(y^y)2J(w, b) = \frac{1}{2m} \sum_{i=1}^{m} (\hat{y} - y)^2
  3. 用梯度下降法(Gradient Descent)来优化代价函数 JJ

如果全部手写计算过程的话,我们需要自己求出导数来进行梯度下降过程。而使用 TensorFlow 这个框架的目的,就是想要让它能够自动完成这个过程。接下来就用 TensorFlow 来实现线性回归(Jupyter Notebook 格式的源代码可以访问我的 GitHub 仓库下载):

  1. 导入库 numpy 与 tensorflow:

    import numpy as np
    import tensorflow as tf
  2. 读入数据。方便起见,这里直接定义了四个数据点 (1,2) (2,3) (3,4) (4,5),不难看出,wwbb 的最优参数均为 1。

    data_X = np.array([1, 2, 3, 4])
    data_Y = 1 * data_X + 1
  3. 定义模型

    Y=WX+bY = WX + b
    def model(W, b, X):
        return W * X + b
  4. 将参数 WW 定义成变量,输入数据 XX 和输出数据 YY 定义成占位符:

    W = tf.Variable([.1], dtype=tf.float32)
    b = tf.Variable([.1], dtype=tf.float32)
    X = tf.placeholder(tf.float32)
    Y = tf.placeholder(tf.float32)
  5. 定义表示模型输出值的变量 Y_hat,以及代价函数 JJ。其中,使用 MSE 作为代价函数。另外,选用梯度下降优化器,学习率为 0.01。设定代价函数 JJ 为优化器的优化目标。

    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)
  6. 执行训练过程。先初始化所有的变量,然后训练 1000 次,最后输出 WWbb

    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 来完成了。


Share this post on:

Previous Post
TensorFlow实战2:逻辑回归(Logistic Regression)
Next Post
TensorFlow学习笔记2:训练