【实践】基于TensorFlow的线性回归算法实现

之前在斯坦福公开课过程中,学习了一些关于线性回归算法的知识,大概了解了它比较基本的原理与算法,结合所学的理论知识,结合TensorFlow的代码,在了解TensorFlow的API的过程中,对线性回归算法再加深理解。

TensorFlow初学例子代码库:https://github.com/aymericdamien/TensorFlow-Examples/ 

程序在代码库中的路径:examples\2_BasicModels\linear_regression.py

这里面的还有许多其他的程序和资源,在今后的过程中,边学边看。

在开始读这个TensorFlow线性回归的Python程序之前,先看下线性回归中用到的TensorFlow中算法的api:

梯度下降优化器

tf.train.GradientDescentOptimizer的构造函数:

__init__(learning_rate,use_locking=False,name='GradientDescent')

  • 参数1:一个float型的值来表示学习率
  • 参数2:表示是否锁定操作过程中的赋值操作,默认(false)是都可以赋值。变量可以进行并发的读和写操作(operation)。由于变量是并发(concurrently)更新的, 所以从一个变量中读出的值可能会改变。在不互斥的条件下,对一个变量的并发的许多赋值操作(operation)是默认允许运行的。在对一个变量赋值时,如果想要加锁。
  • 参数3:在执行梯度下降算法时创建的操作名称。

梯度下降优化器中的一个方法:

minimize(loss, global_step=None, var_list=None, gate_gradients=GATE_OP, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None)

  • 参数1:一个包含需要最小化值的张量
  • 参数2及其之后的参数,都为可选参数,不太明白,之后深入学习之后,再来做深入了解。

算法的计算过程虽然复杂,TensorFlow已经为我们把一些基本算法的实现做成api,从代码上来看,不会很长,但是理解编程过程中的逻辑与算法实现,是非常重要的。

我们知道TensorFlow都基本上是在做构件图和运行图的操作,首先看下例子中是如何构建计算图的:

from __future__ import print_function

import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
rng = numpy.random

# Parameters
learning_rate = 0.03       #学习率
training_epochs = 1000     #根据误差而做调整的迭代次数
display_step = 50          #每50次输出一下计算到的参数值,和误差

# Training Data
train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
                         7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
                         2.827,3.465,1.65,2.904,2.42,2.94,1.3])
n_samples = train_X.shape[0]    # 样本容量即样本个数

# tf Graph Input
X = tf.placeholder("float")     #占位符,给后面的计算过程起站位作用
Y = tf.placeholder("float")

# Set model weights
W = tf.Variable(rng.randn(), name="weight")    #线性回归模型的参数(亦即权重)
b = tf.Variable(rng.randn(), name="bias")

# Construct a linear model
pred = tf.add(tf.multiply(X, W), b)            #线性模型。y=WX+b

# Mean squared error
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)      #均方差
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #基于均方差做梯度下降算法

上面的代码都是TensorFlow中对计算图的构建,计算图和数据都准备好之后,就可以运行会话来操作计算图了:

# Initializing the variables
init = tf.global_variables_initializer()    #TensorFlow中对变量的初始化

# Launch the graph                         以上计算图的构建就算完成了,下面开始将图放在会话中开始执行
with tf.Session() as sess:                
    sess.run(init)                          #初始化变量

    # Fit all training data
    for epoch in range(training_epochs):       #开始用for循环训练数据迭代计算
        for (x, y) in zip(train_X, train_Y):   #将训练的数据,成对取出
            sess.run(optimizer, feed_dict={X: x, Y: y})  #执行梯度下降优化器(同时给优化器喂数据)

        # Display logs per epoch step                 每50次迭代输出log
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b))

    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n') #输出结果

    # Graphic display
    plt.plot(train_X, train_Y, 'ro', label='Original data')                   #用训练数据画线性图
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()

    # Testing example, as requested (Issue #2)                        用测试数据来检测上面的学习结果,并绘图
    test_X = numpy.asarray([6.83, 4.668, 8.9, 7.91, 5.7, 8.7, 3.1, 2.1])
    test_Y = numpy.asarray([1.84, 2.273, 3.2, 2.831, 2.92, 3.24, 1.35, 1.03])

    print("Testing... (Mean square loss Comparison)")
    testing_cost = sess.run(
        tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * test_X.shape[0]),
        feed_dict={X: test_X, Y: test_Y})  # same function as cost above
    print("Testing cost=", testing_cost)
    print("Absolute mean square loss difference:", abs(
        training_cost - testing_cost))

    plt.plot(test_X, test_Y, 'bo', label='Testing data')
    plt.plot(test_X, sess.run(W) * test_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()

根据算法的理论,学习率决定了这个损失函数趋近最小值时做出调整前后的差值大小,如果选大,有可能在最小值周围震荡,若设置偏小,则趋近速度减小,效率低下。

可以根据需要来对其进行修改。

上面程序输出结果如下:

基于训练数据,训练出来的线性模型作图:




测试数据集,与线性模型的误差关系:


执行过程中输出的log:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值