运用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实现分割文件及合并文件的方法
Jul 10 Python
python追加元素到列表的方法
Jul 28 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
python下载文件记录黑名单的实现代码
Oct 24 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Python中format()格式输出全解
Apr 12 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 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 IP转换整形(ip2long)的详解
2013/06/06 PHP
php类常量的使用详解
2013/06/08 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
javascript实现日期格式转换
2014/12/16 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
python的变量与赋值详细分析
2017/11/08 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Pytorch 实现权重初始化
2019/12/31 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
数字漫画:comiXology
2020/06/13 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
优秀信贷员先进事迹
2014/01/31 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
自我检讨书范文
2015/01/28 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript