运用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使用xmlrpc实例讲解
Dec 17 Python
python中执行shell命令的几个方法小结
Sep 18 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
dataframe设置两个条件取值的实例
Apr 12 Python
python检索特定内容的文本文件实例
Jun 05 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
python套接字socket通信
Apr 01 Python
python lambda 表达式形式分析
Apr 03 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
数据库的日期格式转换
2006/10/09 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
JS中定位 position 的使用实例代码
2017/08/06 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
详解python中的异常和文件读写
2021/01/03 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
营销计划书
2015/01/17 职场文书
医德医风自我评价2015
2015/03/03 职场文书
海上钢琴师观后感
2015/06/03 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python