运用TensorFlow进行简单实现线性回归、梯度下降示例


Posted in Python onMarch 05, 2018

线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可。

单变量线性回归:

a) 因为是线性回归,所以学习到的函数为线性函数,即直线函数;

b) 因为是单变量,因此只有一个x。

我们能够给出单变量线性回归的模型:

运用TensorFlow进行简单实现线性回归、梯度下降示例

我们常称x为feature,h(x)为hypothesis。

上面介绍的方法中,我们肯定有一个疑问,怎样能够看出线性函数拟合的好不好呢?

所以此处,我们需要使用到Cost Function(代价函数),代价函数越小,说明线性回归也越好(和训练集合拟合的越好),当然最小就是0,即完全拟合。

举个实际的例子:

我们想要根据房子的大小,预测房子的价格,给定如下数据集:

运用TensorFlow进行简单实现线性回归、梯度下降示例

根据上面的数据集,画出如下所示的图:

运用TensorFlow进行简单实现线性回归、梯度下降示例

我们需要根据这些点拟合出一条直线,使得Cost Function最小。虽然现在我们还不知道Cost Function内部到底是什么样的,但是我们的目标是:给定输入向量x,输出向量y,theta向量,输出Cost值。

Cost Function:

Cost Function的用途:对假设的函数进行评价,Cost Function越小的函数,说明对训练数据拟合的越好。

下图详细说明了当Cost Function为黑盒的时候,Cost Function的作用:

运用TensorFlow进行简单实现线性回归、梯度下降示例

但是我们肯定想知道Cost Function的内部结构是什么?因此我们给出下面的公式:

运用TensorFlow进行简单实现线性回归、梯度下降示例

其中:

运用TensorFlow进行简单实现线性回归、梯度下降示例表示向量x中的第i个元素;

运用TensorFlow进行简单实现线性回归、梯度下降示例表示向量y中的第i个元素;

运用TensorFlow进行简单实现线性回归、梯度下降示例表示已知的假设函数;m表示训练集的数量。

运用TensorFlow进行简单实现线性回归、梯度下降示例

如果theta0一直为0,则theta1与J的函数为:

运用TensorFlow进行简单实现线性回归、梯度下降示例

如果theta0和theta1都不固定,则theta0、theta1、J的函数为:

运用TensorFlow进行简单实现线性回归、梯度下降示例

当然我们也能够用二维的图来表示,即等高线图:

运用TensorFlow进行简单实现线性回归、梯度下降示例

注意如果是线性回归,则cost function一定是碗状的,即只有一个最小点。

Gradient Descent(梯度下降):

但是又一个问题引出来了,虽然给定一个函数,我们能够根据cost function知道这个函数拟合的好不好,但是毕竟函数有这么多,总不能一个一个试吧?

于是我们引出了梯度下降:能够找出cost function函数的最小值。(当然解决问题的方法有很多,梯度下降只是其中一个,还有一种方法叫Normal Equation)。

梯度下降的原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快。

方法:

a) 先确定向下一步的步伐大小,我们称为learning rate;

b) 任意给定一个初始值:运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例

c) 确定一个向下的方向,并向下走预定的步伐,并更新运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例

d) 当下降的高度小于某个定义的值,则停止下降。

算法:

运用TensorFlow进行简单实现线性回归、梯度下降示例

特点:

a)初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值;

b)越接近最小值,下降速度越慢。

问题1:如果运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例初始值就在local minimum的位置,则运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例会如何变化?

答案:因为运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例已经在local minimum位置,所以derivative肯定是0,因此运用TensorFlow进行简单实现线性回归、梯度下降示例运用TensorFlow进行简单实现线性回归、梯度下降示例不会改变。

问题2:如果取到一个正确的运用TensorFlow进行简单实现线性回归、梯度下降示例值,则cost function应该会越来越小。那么,怎么取运用TensorFlow进行简单实现线性回归、梯度下降示例值?

答案:随时观察运用TensorFlow进行简单实现线性回归、梯度下降示例值,如果cost function变小了,则OK;反之,则再取一个更小的值。

下图就详细说明了梯度下降的过程:

运用TensorFlow进行简单实现线性回归、梯度下降示例

从上图中可以看出:初始点不同,获得的最小值也不同,因此,梯度下降求得的只是局部最小值。

注意:下降的步伐大小非常重要,因为,如果太小,则找到函数最小值的速度就很慢;如果太大,则可能会出现overshoot the minimum现象。

下图就是overshoot现象:

运用TensorFlow进行简单实现线性回归、梯度下降示例

如果Learning Rate取值后发现J function增长了,则需要减小Learning Rate的值。

Integrating with Gradient Descent & Linear Regression:

梯度下降能够求出一个函数的最小值。

线性回归需要求得最小的Cost Function。

因此我们能够对Cost Function运用梯度下降,即将梯度下降和线性回归进行整合,如下图所示:

运用TensorFlow进行简单实现线性回归、梯度下降示例

梯度下降是通过不停的迭代,而我们比较关注迭代的次数,因为这关系到梯度下降的执行速度,为了减少迭代次数,因此引入了Feature Scaling。

Feature Scaling:

此种方法应用于梯度下降,为了加快梯度下降的执行速度。

思想:将各个feature的值标准化,使得取值范围大致都在-1<=x<=1之间。

常用的方法是Mean Normalization,即运用TensorFlow进行简单实现线性回归、梯度下降示例,或者[X-mean(X)]/std(X)。

运用TensorFlow进行简单实现线性回归、梯度下降示例

练习题

我们想要通过期中考试成绩预测期末考试成绩,我们希望得到的方程为:

运用TensorFlow进行简单实现线性回归、梯度下降示例

给定以下训练集:

运用TensorFlow进行简单实现线性回归、梯度下降示例

我们想对(midterm exam)^2进行feature scaling,则运用TensorFlow进行简单实现线性回归、梯度下降示例经过feature scaling后的值为多少?

解答:其中max = 8836,min = 4761,mean = 6675.5,则运用TensorFlow进行简单实现线性回归、梯度下降示例 = (4761 - 6675.5)/(8836 - 4761) = -0.47 。

多变量线性回归

前面我们只介绍了单变量的线性回归,即只有一个输入变量,现实世界可不只是这么简单,因此此处我们要介绍多变量的线性回归。

举个例子:房价其实受很多因素决定,比如size、number of bedrooms、number of floors、age of home等,这里我们假设房价由4个因素决定,如下图所示:

运用TensorFlow进行简单实现线性回归、梯度下降示例

我们前面定义过单变量线性回归的模型:

运用TensorFlow进行简单实现线性回归、梯度下降示例

这里我们可以定义出多变量线性回归的模型:

运用TensorFlow进行简单实现线性回归、梯度下降示例

Cost Function如下:

运用TensorFlow进行简单实现线性回归、梯度下降示例

如果下面我们要用梯度下降解决多变量的线性回归,则我们还是可以用传统的梯度下降算法进行计算:

运用TensorFlow进行简单实现线性回归、梯度下降示例

总练习题

我们想要根据一个学生第一年的成绩预测第二年的成绩,x为第一年得到A的数量,y为第二年得到A的数量,给定以下数据集:

运用TensorFlow进行简单实现线性回归、梯度下降示例

(1) 训练集的个数?

答:4个。

(2) J(0, 1)的结果是多少?

解:J(0,1) = 1/(2*4)*[(3-4)^2+(2-1)^2+(4-3)^2+(0-1)^2] = 1/8*(1+1+1+1) = 1/2 = 0.5。

我们也可以通过vectorization的方法快速算出J(0, 1):

运用TensorFlow进行简单实现线性回归、梯度下降示例

下面是通过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, w, 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现统计代码行数的方法
May 22 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
python通过http下载文件的方法详解
Jul 26 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Django操作session 的方法
Mar 09 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 #Python
用tensorflow搭建CNN的方法
Mar 05 #Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 #Python
python使用Pycharm创建一个Django项目
Mar 05 #Python
python爬虫基本知识
Mar 05 #Python
用tensorflow构建线性回归模型的示例代码
Mar 05 #Python
详解python实现线程安全的单例模式
Mar 05 #Python
You might like
PHP form 表单传参明细研究
2009/07/17 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
PHP _construct()函数讲解
2019/02/03 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
JS 跳转页面延迟2种方法
2013/03/29 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
node使用promise替代回调函数
2018/05/07 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Python简单进程锁代码实例
2015/04/27 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
Python中装饰器高级用法详解
2017/12/25 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python爬虫增加访问量的方法
2019/08/22 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
师范生自荐信
2013/10/27 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
教师三严三实心得体会
2014/10/11 职场文书
药店收银员岗位职责
2015/04/07 职场文书
小学生读书笔记
2015/07/01 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫