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

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

  1. 定义一个模型,也就是一个计算式,来表达输入x与输出y的关系。比如线性回归模型:y=wx+b。学习的过程就是不断更新参数w和b的过程。
  2. 设置一个代价函数,表征当前的参数w和b有多”好“。比较常用的函数是均方误差(MSE)函数:
    $$J(w,b)=\frac{1}{2m}\sum_{i=1}^m(\hat{y}-y)^2$$
  3. 用梯度下降法(Gradient Descent)来优化代价函数J。

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

  1. 导入库numpy与tensorflow
import numpy as np
import tensorflow as tf
  1. 读入数据。方便起见,这里直接定义了四个数据点(1,2)(2,3)(3,4)(4,5)不难看出,w和b的最优参数均为1。
data_X = np.array([1,2,3,4])
data_Y = 1*data_X + 1
  1. 定义模型$$Y=WX+b$$
def model(W,b,X):
    return W*X+b
  1. 将参数W定义成变量,输入数据X和输出数据Y定义成占位符。
W = tf.Variable([.1], dtype=tf.float32)
b = tf.Variable([.1], dtype=tf.float32)
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
  1. 定义表示模型输出值的变量Y_hat,以及代价函数J。其中,使用MSE作为代价函数。另外,选用梯度下降优化器,学习率为0.01。设定代价函数J为优化器的优化目标。
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)
  1. 执行训练过程。先初始化所有的变量,然后训练1000次,最后输出W和b
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来完成了。

标签: tensorflow

添加新评论