运用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 20 Python
深入讲解Python编程中的字符串
Oct 14 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
pycharm设置注释颜色的方法
May 23 Python
python2.7实现邮件发送功能
Dec 12 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
logging level级别介绍
Feb 21 Python
Python实现分数序列求和
Feb 25 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
详解tensorflow之过拟合问题实战
Nov 01 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
用PHP生成静态HTML速度快类库
2007/03/18 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
分析经典Python开发工程师面试题
2019/04/08 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
Django缓存系统实现过程解析
2019/08/02 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
顺丰快递Java软件工程师面试题
2015/07/31 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
工程概预算专业毕业生求职信
2013/10/04 职场文书
营业员个人总结的自我评价
2013/10/25 职场文书
汽修专业学生自我鉴定
2013/11/16 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
校友会致辞
2015/07/30 职场文书
师德培训心得体会2016
2016/01/09 职场文书
修辞手法有哪些?
2019/08/29 职场文书
基于Redission的分布式锁实战
2022/08/14 Redis