运用TensorFlow进行简单实现线性回归、梯度下降示例
线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可。 单变量线性回归: a) 因为是线性回归,所以学习到的函数为线性函数,即直线函数; b) 因为是单变量,因此只有一个x。 我们能够给出单变量线性回归的模型: 我们常称x为feature,h(x)为hypothesis。 上面介绍的方法中,我们肯定有一个疑问,怎样能够看出线性函数拟合的好不好呢? 所以此处,我们需要使用到Cost Function(代价函数),代价函数越小,说明线性回归也越好(和训练集合拟合的越好),当然最小就是0,即完全拟合。 举个实际的例子: 我们想要根据房子的大小,预测房子的价格,给定如下数据集: 根据上面的数据集,画出如下所示的图: 我们需要根据这些点拟合出一条直线,使得Cost Function最小。虽然现在我们还不知道Cost Function内部到底是什么样的,但是我们的目标是:给定输入向量x,输出向量y,theta向量,输出Cost值。 Cost Function: Cost Function的用途:对假设的函数进行评价,Cost Function越小的函数,说明对训练数据拟合的越好。 下图详细说明了当Cost Function为黑盒的时候,Cost Function的作用: 但是我们肯定想知道Cost Function的内部结构是什么?因此我们给出下面的公式: 其中: 如果theta0一直为0,则theta1与J的函数为: 如果theta0和theta1都不固定,则theta0、theta1、J的函数为: 当然我们也能够用二维的图来表示,即等高线图: 注意如果是线性回归,则cost function一定是碗状的,即只有一个最小点。 Gradient Descent(梯度下降): 但是又一个问题引出来了,虽然给定一个函数,我们能够根据cost function知道这个函数拟合的好不好,但是毕竟函数有这么多,总不能一个一个试吧? 于是我们引出了梯度下降:能够找出cost function函数的最小值。(当然解决问题的方法有很多,梯度下降只是其中一个,还有一种方法叫Normal Equation)。 梯度下降的原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快。 方法: a) 先确定向下一步的步伐大小,我们称为learning rate; b) 任意给定一个初始值: c) 确定一个向下的方向,并向下走预定的步伐,并更新 d) 当下降的高度小于某个定义的值,则停止下降。 算法: 特点: a)初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值; b)越接近最小值,下降速度越慢。 问题1:如果 答案:因为 问题2:如果取到一个正确的 答案:随时观察 下图就详细说明了梯度下降的过程: 从上图中可以看出:初始点不同,获得的最小值也不同,因此,梯度下降求得的只是局部最小值。 注意:下降的步伐大小非常重要,因为,如果太小,则找到函数最小值的速度就很慢;如果太大,则可能会出现overshoot the minimum现象。 下图就是overshoot现象: 如果Learning Rate取值后发现J function增长了,则需要减小Learning Rate的值。 Integrating with Gradient Descent & Linear Regression: 梯度下降能够求出一个函数的最小值。 线性回归需要求得最小的Cost Function。 因此我们能够对Cost Function运用梯度下降,即将梯度下降和线性回归进行整合,如下图所示: 梯度下降是通过不停的迭代,而我们比较关注迭代的次数,因为这关系到梯度下降的执行速度,为了减少迭代次数,因此引入了Feature Scaling。 Feature Scaling: 此种方法应用于梯度下降,为了加快梯度下降的执行速度。 思想:将各个feature的值标准化,使得取值范围大致都在-1<=x<=1之间。 常用的方法是Mean Normalization,即 练习题 我们想要通过期中考试成绩预测期末考试成绩,我们希望得到的方程为: 给定以下训练集: 我们想对(midterm exam)^2进行feature scaling,则 解答:其中max = 8836,min = 4761,mean = 6675.5,则 多变量线性回归 前面我们只介绍了单变量的线性回归,即只有一个输入变量,现实世界可不只是这么简单,因此此处我们要介绍多变量的线性回归。 举个例子:房价其实受很多因素决定,比如size、number of bedrooms、number of floors、age of home等,这里我们假设房价由4个因素决定,如下图所示: 我们前面定义过单变量线性回归的模型: 这里我们可以定义出多变量线性回归的模型: Cost Function如下: 如果下面我们要用梯度下降解决多变量的线性回归,则我们还是可以用传统的梯度下降算法进行计算: 总练习题 我们想要根据一个学生第一年的成绩预测第二年的成绩,x为第一年得到A的数量,y为第二年得到A的数量,给定以下数据集:
下面是通过TensorFlow进行简单的实现: #!/usr/bin/env python from __future__ import print_function import tensorflow as tf import numpy as np trX = np.linspace(-1,1,101) # create a y value which is approximately linear but with some random noise trY = 2 * trX + np.ones(*trX.shape) * 4 + np.random.randn(*trX.shape) * 0.03 X = tf.placeholder(tf.float32) # create symbolic variables Y = tf.placeholder(tf.float32) def model(X,w,b): # linear regression is just X*w + b,so this model line is pretty simple return tf.mul(X,w) + b # create a shared for weight s w = tf.Variable(0.0,name="weights") # create a variable for biases b = tf.Variable(0.0,name="biases") y_model = model(X,b) cost = tf.square(Y - y_model) # use square error for cost function # construct an optimizer to minimize cost and fit line to mydata train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # launch the graph in a session with tf.Session() as sess: # you need to initialize variables (in this case just variable w) init = tf.initialize_all_variables() sess.run(init) # train for i in range(100): for (x,y) in zip(trX,trY): sess.run(train_op,feed_dict={X: x,Y: y}) # print weight print(sess.run(w)) # it should be something around 2 # print bias print(sess.run(b)) # it should be something atound 4 参考: TensorFlow线性回归Demo 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |