tensorflow学习笔记(3)|线性回归

有关Linear regression的背景知识

Linear regression 线性回归,我们先来看官方的解释:

线性回归(Linear regression)是一种以线性模型来建模自变量与因变量关系的方法. 通常来说, 当自变量只有一个的情况被称为简单线性回归, 自变量大于一个的情况被称为多重线性回归。

其实这个东西我们在上初中的时候就接触过,就是一元一次方程啊。

                                    Y = a X + b

所谓的简单线性回归也不过是一元一次方程,多重线性回归就是多元一次方程

                                  Y = a X + b Z + c

而所谓编程实现的线性回归的过程,就是寻找最优解a,b,c的过程。

然而,科学严肃的解释是这样的:

《tensorflow学习笔记(3)|线性回归》

在线性回归模型中, 模型的未知参数由数据中估计得到. 最常用的拟合方法是最小二乘法, 但是也有许多其他的拟合方法. 因此需要甄别的是, 使用最小二乘法求解并不是构成线性回归模型的必要条件.

线性回归是应用最广泛的回归分析之一, 主要可以用于以下两类:

  • 预测: 线性回归可以在拟合到已知数据集后用于预测自变量所对应的因变量。
  • 解释: 线性回归可以用于量化因变量与自变量之间关系的强度。

利用tensorflow中的API实现线性回归

1.定义参数

learning_rate = 0.01  # 学习率
training_epochs = 1000  #学习次数
display_step = 50   #隔50次检查一次精确度

2.给出训练数据

# 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]

其中,shape()函数的作用是求已知数组的维度,如果是一维数组,给出的是一个具体的数,如果是多维的,就是一个list.返回的总是一个列表,一位数组返回的是只有一个值的列表
3.初始化图像,并命名

# 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")

其实就是将我们要在后面需要拟合的变量W和b命名和初始化。
4.定义一元一次方程的实现逻辑 ,也就是定义线性模型

# Construct a linear model
pred = tf.add(tf.multiply(X, W), b)

类似于 : Y = a X + b
5.定义代价函数,对于代价函数的理解,就是实际拟合的数值和实际值之间的误差的加和。代价可以看做预测值与真实值之间的距离。

# Mean squared error  定义均方差代价函数 
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)

6.定义优化器,将学习率带入其中,并且告诉学习的目的是最小化cost值,并定义初始化函数。

#优化器 ,使用随机梯度下降法进行优化
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Initialize the variables (i.e. assign their default value)
#定义初始化
init = tf.global_variables_initializer()

7.开始训练:

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        # Display logs per epoch step
        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()

对应输出的内容是:

Epoch: 0050 cost= 0.195095107 W= 0.441748 b= -0.580876

Epoch: 0100 cost= 0.181448311 W= 0.430319 b= -0.498661

Epoch: 0150 cost= 0.169377610 W= 0.419571 b= -0.421336

Epoch: 0200 cost= 0.158700854 W= 0.409461 b= -0.348611

Epoch: 0250 cost= 0.149257123 W= 0.399953 b= -0.28021

Epoch: 0300 cost= 0.140904188 W= 0.391011 b= -0.215878

Epoch: 0350 cost= 0.133515999 W= 0.3826 b= -0.155372

Epoch: 0400 cost= 0.126981199 W= 0.374689 b= -0.0984639

Epoch: 0450 cost= 0.121201262 W= 0.367249 b= -0.0449408

Epoch: 0500 cost= 0.116088994 W= 0.360252 b= 0.00539905

Epoch: 0550 cost= 0.111567356 W= 0.35367 b= 0.052745

Epoch: 0600 cost= 0.107568085 W= 0.34748 b= 0.0972751

Epoch: 0650 cost= 0.104030922 W= 0.341659 b= 0.139157

Epoch: 0700 cost= 0.100902475 W= 0.336183 b= 0.178547

Epoch: 0750 cost= 0.098135538 W= 0.331033 b= 0.215595

Epoch: 0800 cost= 0.095688373 W= 0.32619 b= 0.25044

Epoch: 0850 cost= 0.093524046 W= 0.321634 b= 0.283212

Epoch: 0900 cost= 0.091609895 W= 0.317349 b= 0.314035

Epoch: 0950 cost= 0.089917004 W= 0.31332 b= 0.343025

Epoch: 1000 cost= 0.088419855 W= 0.30953 b= 0.370291

Optimization Finished!

Training cost= 0.0884199 W= 0.30953 b= 0.370291 

《tensorflow学习笔记(3)|线性回归》

当tensorflow里面的session调用run()方法的时候,才是真正初始化的时候。
上诉代码的逻辑是:初始化–>遍历数据集–>每隔一个step输出一次–>描点划线
8.测试机开始测试:

# 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(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()

对应输出的内容是:

《tensorflow学习笔记(3)|线性回归》

上诉就是一个典型的线性回归实现的过程。

同系列总结:
tensorflow学习笔记(1)|win10系统pip安装tensorflow
tensorflow学习笔记(2)|基本函数入门

    原文作者:杰梓
    原文地址: https://www.jianshu.com/p/3d0b054a205d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞