在Tensorflow环境下利用梯度下降法进行线性回归

来源:互联网 发布:htc windows系统手机 编辑:程序博客网 时间:2024/06/07 17:27

最近在Coursera学习《Machine Learning 》这门机器学习的入门课。在Matlab中完成作业感觉不是很爽。因此突发奇想,想把第二课的作业在Tensorflow上跑一遍,以加深印象。有关假设模型(Hypothesis)、代价函数(Cost function或Loss function)和梯度下降的概念,请参考前一篇的学习笔记(http://blog.csdn.net/carlwu/article/details/74942634)。

有关Tensorflow的安装,网上资料很多,在此不再赘述。我在CentOS 7上试装,问题很多,浪费了不少时间。在Ubuntu 16.04和Win10上安装起来都比较容易。因此建议使用Ubuntu。闲话不说,直接上Python代码。

# 用Tensorflow来完成Coursera机器学习第二课的作业# 利用梯度下降法实现简单的线性回归# Author: 吴文旷"""在Matlab或Octave可以完成类似的计算,参见http://blog.csdn.net/carlwu/article/details/74942634"""# -*- coding: utf-8 -*-import tensorflow as tfimport numpyimport matplotlib.pyplot as pltrng=numpy.random# 设置参数learning_rate=0.01training_epochs=3000display_step=200# 加载训练数据# train_X表示城市的人口数量train_X=numpy.asarray([6.1101, 5.5277, 8.5186, 7.0032, 5.8598, 8.3829, 7.4764, 8.5781, 6.4862, 5.0546, 5.7107, 14.1640, 5.7340, 8.4084, 5.6407, 5.3794, 6.3654, 5.1301, 6.4296, 7.0708, 6.1891, 20.2700, 5.4901, 6.3261, 5.5649, 18.9450, 12.8280, 10.9570, 13.1760, 22.2030, 5.2524, 6.5894, 9.2482, 5.8918, 8.2111, 7.9334, 8.0959, 5.6063, 12.8360, 6.3534, 5.4069, 6.8825, 11.7080, 5.7737, 7.8247, 7.0931, 5.0702, 5.8014, 11.7000, 5.5416, 7.5402, 5.3077, 7.4239, 7.6031, 6.3328, 6.3589, 6.2742, 5.6397, 9.3102, 9.4536, 8.8254, 5.1793, 21.2790, 14.9080, 18.9590, 7.2182, 8.2951, 10.2360, 5.4994, 20.3410, 10.1360, 7.3345, 6.0062, 7.2259, 5.0269, 6.5479, 7.5386, 5.0365, 10.2740, 5.1077, 5.7292, 5.1884, 6.3557, 9.7687, 6.5159, 8.5172, 9.1802, 6.0020, 5.5204, 5.0594, 5.7077, 7.6366, 5.8707, 5.3054, 8.2934, 13.3940, 5.4369])# train_Y代表城市的利润train_Y=numpy.asarray([ 17.5920, 9.1302, 13.6620, 11.8540, 6.8233, 11.8860, 4.3483, 12.0000, 6.5987, 3.8166, 3.2522, 15.5050, 3.1551, 7.2258, 0.7162, 3.5129, 5.3048, 0.5608, 3.6518, 5.3893, 3.1386, 21.7670, 4.2630, 5.1875, 3.0825, 22.6380, 13.5010, 7.0467, 14.6920, 24.1470, -.2200, 5.9966, 12.1340, 1.8495, 6.5426, 4.5623, 4.1164, 3.3928, 10.1170, 5.4974, 0.5566, 3.9115, 5.3854, 2.4406, 6.7318, 1.0463, 5.1337, 1.8440, 8.0043, 1.0179, 6.7504, 1.8396, 4.2885, 4.9981, 1.4233, -1.4211, 2.4756, 4.6042, 3.9624, 5.4141, 5.1694, -0.7428, 17.9290, 12.0540, 17.0540, 4.8852, 5.7442, 7.7754, 1.0173, 20.9920, 6.6799, 4.0259, 1.2784, 3.3411, -.6807, 0.2968, 3.8845, 5.7014, 6.7526, 2.0576, 0.4795, 0.2042, 0.6786, 7.5435, 5.3436, 4.2415, 6.7981, 0.9270, 0.1520, 2.8214, 1.8451, 4.2959, 7.2029, 1.9869, 0.1445, 9.0551, 0.6170])# 样本数量n_samples=train_X.size;# tf Graph InputX=tf.placeholder("float")Y=tf.placeholder("float")# 创建假设模型 Y=W*X + b# 设置参数W和b的初始值,也就是theta0 和 theta1的初始值W=tf.Variable(0.0, name="weight")b=tf.Variable(0.0, name="bias")# 构筑一个线性假设模型activation=tf.add(tf.mul(X, W), b)# 利用梯度下降法来最小化代价函数cost=tf.reduce_sum(tf.pow(activation-Y, 2))/(2*n_samples) #L2 lossoptimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent# 初始化变量:Initializing the variablesinit=tf.global_variables_initializer()# 启动图(graph),节点(operation)和边(tensor)相互连接成图.一个 TensorFlow 图描述了计算的过程with tf.Session() as sess:    sess.run(init)    # 对训练数据拟合    for epoch in range(training_epochs):        for (x, y) in zip(train_X, train_Y):            sess.run(optimizer, feed_dict={X: x, Y: y})        #显示迭代过程        if epoch % display_step == 0:            print("迭代", (epoch+1), "次后代价函数=", \                "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y:train_Y})), \                "参数theta0 (W)=", sess.run(W), "参数theta1 (b)=", sess.run(b))    print("优化结束!")    print("代价函数cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), \          "参数theta0 (W)=", sess.run(W), "参数theta1 (b)=", sess.run(b))    #线性回归的可视化显示    plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签    plt.plot(train_X, train_Y, 'ro', label=u'训练数据点')    plt.xlabel(u'人口')    plt.ylabel(u'利润')    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label=u'回归线')    plt.legend()    plt.show()

C:\Users\Carl\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Carl/PycharmProjects/learn/tensorFlow/test2.py
迭代 1 次后代价函数= 11.395619392 参数theta0 (W)= 0.427296 参数theta1 (b)= 0.0356404
迭代 201 次后代价函数= 5.101614952 参数theta0 (W)= 0.874693 参数theta1 (b)= -1.09961
迭代 401 次后代价函数= 4.758601665 参数theta0 (W)= 0.956675 参数theta1 (b)= -1.91183
迭代 601 次后代价函数= 4.590910435 参数theta0 (W)= 1.01368 参数theta1 (b)= -2.47656
迭代 801 次后代价函数= 4.508553028 参数theta0 (W)= 1.05331 参数theta1 (b)= -2.86919
迭代 1001 次后代价函数= 4.467835903 参数theta0 (W)= 1.08086 参数theta1 (b)= -3.14219
迭代 1201 次后代价函数= 4.447523594 参数theta0 (W)= 1.10002 参数theta1 (b)= -3.33199
迭代 1401 次后代价函数= 4.437268257 参数theta0 (W)= 1.11334 参数theta1 (b)= -3.46395
迭代 1601 次后代价函数= 4.432003498 参数theta0 (W)= 1.12261 参数theta1 (b)= -3.55574
迭代 1801 次后代价函数= 4.429249763 参数theta0 (W)= 1.12905 参数theta1 (b)= -3.61957
迭代 2001 次后代价函数= 4.427772522 参数theta0 (W)= 1.13353 参数theta1 (b)= -3.66396
迭代 2201 次后代价函数= 4.426954746 参数theta0 (W)= 1.13664 参数theta1 (b)= -3.6948
迭代 2401 次后代价函数= 4.426488876 参数theta0 (W)= 1.13881 参数theta1 (b)= -3.71624
迭代 2601 次后代价函数= 4.426216125 参数theta0 (W)= 1.14031 参数theta1 (b)= -3.73115
迭代 2801 次后代价函数= 4.426048279 参数theta0 (W)= 1.14136 参数theta1 (b)= -3.74151
优化结束!
代价函数cost= 4.42595 参数theta0 (W)= 1.14208 参数theta1 (b)= -3.7487

从上面的运行结果,我们可以看到代价函数的值在不断减小,这就是梯度下降法的目的。迭代3000次后,代价函数的值从初始的11.395619392逐渐减小到4.42595,此时参数θ0和θ1的值大约为-3.7487和1.14208。根据最小二乘法,我们会得到θ0和θ1的精确结果为-3.8128和1.1867。由此可见,Tensorflow中进行梯度下降迭代的收敛速度还是比较慢的。在Matlab中,给定同样的初始条件和迭代次数,迭代3000次后的代价函数值大约为4.366376,得到的θ0和θ1分别为-3.6303和1.1664。

线性回归的可视化结果如下:
这里写图片描述

原创粉丝点击