运用TensorFlow进行简单实现线性回归、梯度下降示例
作者:universe_ant 发布时间:2022-03-02 10:30:15
线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(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的内部结构是什么?因此我们给出下面的公式:
其中:
表示向量x中的第i个元素;
表示向量y中的第i个元素;
表示已知的假设函数;m表示训练集的数量。
如果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:如果和
初始值就在local minimum的位置,则
、
会如何变化?
答案:因为、
已经在local minimum位置,所以derivative肯定是0,因此
、
不会改变。
问题2:如果取到一个正确的值,则cost function应该会越来越小。那么,怎么取
值?
答案:随时观察值,如果cost function变小了,则OK;反之,则再取一个更小的值。
下图就详细说明了梯度下降的过程:
从上图中可以看出:初始点不同,获得的最小值也不同,因此,梯度下降求得的只是局部最小值。
注意:下降的步伐大小非常重要,因为,如果太小,则找到函数最小值的速度就很慢;如果太大,则可能会出现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,即,或者[X-mean(X)]/std(X)。
练习题
我们想要通过期中考试成绩预测期末考试成绩,我们希望得到的方程为:
给定以下训练集:
我们想对(midterm exam)^2进行feature scaling,则经过feature scaling后的值为多少?
解答:其中max = 8836,min = 4761,mean = 6675.5,则 = (4761 - 6675.5)/(8836 - 4761) = -0.47 。
多变量线性回归
前面我们只介绍了单变量的线性回归,即只有一个输入变量,现实世界可不只是这么简单,因此此处我们要介绍多变量的线性回归。
举个例子:房价其实受很多因素决定,比如size、number of bedrooms、number of floors、age of home等,这里我们假设房价由4个因素决定,如下图所示:
我们前面定义过单变量线性回归的模型:
这里我们可以定义出多变量线性回归的模型:
Cost Function如下:
如果下面我们要用梯度下降解决多变量的线性回归,则我们还是可以用传统的梯度下降算法进行计算:
总练习题
我们想要根据一个学生第一年的成绩预测第二年的成绩,x为第一年得到A的数量,y为第二年得到A的数量,给定以下数据集:
(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进行简单的实现:
#!/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
来源:http://blog.csdn.net/universe_ant/article/details/52743097


猜你喜欢
- 这是通过博主写的英雄联盟下载器下载的部分的英雄皮肤,可以看一下效果。每个英雄的皮肤的会自动根据英雄名称创建相应的文件夹存放。实现思路比较简单
- 代码如下:<%@ Language=VBScript %> <% Dim 
- 我的工作内容可以说是五花八门,策划、文案、设计(包括平面设计、网站设计、VIS设计)、前端代码、交互、测试、摄影、项目管理等。所有这些工作最
- 在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版
- Python 基础教程之包和类的用法建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有
- 上班族经常会遇到这样情况,着急下班结果将关机误点成重启,或者临近下班又通知开会,开完会已经迟了还要去给电脑关机。今天使用PyQt5做了个自动
- 编写程序,完成“名片管理器”项目需要完成的基本功能:添加名片删除名片修改名片查询名片退出系统程序运行后,除非选择退出系统,否则重复执行功能m
- 本文实例讲述了Python实现的大数据分析操作系统日志功能。分享给大家供大家参考,具体如下:一 代码1、大文件切分import osimpo
- 1. Python中的异常栈跟踪之前在做Java的时候,异常对象默认就包含stacktrace相关的信息,通过异常对象的相关方法printS
- 在写sql的时候,由于有部分语句别名不能调用,百度了一下原因,原来是由于别名机制不同引起的。为了避免下一次再犯同样的错误,今天把网上找到资料
- 首先,打开MSSQL2008,然后在“管理”大类中,双击“维护计划”子类,这时候,如果以前设置过任务计划的,就会显示出任务列表;如果没有,那
- 说实在的个人对游戏并没有多大的兴趣,但唯独对暴雪的Diablo系列很有感情,去年年初开始玩Diablo3,断断续续,感觉最麻烦的是选择技能,
- 一、前言越来越多的网站和App开始为用户搭建签到系统,以此来吸引和留住用户。签到系统是一种轻量、互动性强的营销方式,通过用户签到获取免费权益
- 动机: 查询功能是我们在网站上见过的最普遍也是最常用的一个功能模块了。以往的信息查询都是连接到数据库的,每一次点击都必须要后台数据库的支持。
- 本文实例讲述了Python使用multiprocessing创建进程的方法。分享给大家供大家参考。具体分析如下:进程可以通过调用multip
- 基于Ubuntu16.04 + Python3 + nginx + mysql + Django接下来先安装这些必要的环境,这些操作都是在你
- 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说。bootstrap:能够增加兼容性的强
- 最近学习了SSD算法,了解了其基本的实现思路,并通过SSD模型训练自己的模型。基本环境torch1.2.0Pillow8.2.0torchv
- 本文实例讲述了Python使用matplotlib绘图无法显示中文问题的解决方法。分享给大家供大家参考,具体如下:在python中,默认情况
- 可扩展标记语言 (XML) 是用于描述数据集内容以及应如何将数据输出到设备上或如何在 Web 页上显示数据的语言。标记语言的创建来源于出版商