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

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

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

您可能感兴趣的文章:

  • 用tensorflow构建线性回归模型的示例代码
(0)

相关推荐

  • 用tensorflow构建线性回归模型的示例代码

    用tensorflow构建简单的线性回归模型是tensorflow的一个基础样例,但是原有的样例存在一些问题,我在实际调试的过程中做了一点自己的改进,并且有一些体会. 首先总结一下tf构建模型的总体套路 1.先定义模型的整体图结构,未知的部分,比如输入就用placeholder来代替. 2.再定义最后与目标的误差函数. 3.最后选择优化方法. 另外几个值得注意的地方是: 1.tensorflow构建模型第一步是先用代码搭建图模型,此时图模型是静止的,是不产生任何运算结果的,必须使用Session

  • Pyspark 线性回归梯度下降交叉验证知识点详解

    我正在尝试在 pyspark 中的 SGD 模型上执行交叉验证,我正在使用pyspark.mllib.regression,ParamGridBuilder和CrossValidator都来自pyspark.ml.tuning库的LinearRegressionWithSGD. 在 Spark 网站上跟踪文件资料之后,我希望运行此方法可以正常工作 资料参考:https://spark.apache.org/docs/2.1.0/ml-tuning.html lr = LinearRegressi

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

    线性回归属于监督学习,因此方法和监督学习应该是一样的,先给定一个训练集,根据这个训练集学习出一个线性函数,然后测试这个函数训练的好不好(即此函数是否足够拟合训练集数据),挑选出最好的函数(cost function最小)即可. 单变量线性回归: a) 因为是线性回归,所以学习到的函数为线性函数,即直线函数: b) 因为是单变量,因此只有一个x. 我们能够给出单变量线性回归的模型: 我们常称x为feature,h(x)为hypothesis. 上面介绍的方法中,我们肯定有一个疑问,怎样能够看出线性

  • 使用TensorFlow实现简单线性回归模型

    本文使用TensorFlow实现最简单的线性回归模型,供大家参考,具体内容如下 线性拟合y=2.7x+0.6,代码如下: import tensorflow as tf import numpy as np import matplotlib.pyplot as plt n = 201 # x点数 X = np.linspace(-1, 1, n)[:,np.newaxis] # 等差数列构建X,[:,np.newaxis]这个是shape,这一行构建了一个n维列向量([1,n]的矩阵) noi

  • TensorFlow实现简单线性回归

    本文实例为大家分享了TensorFlow实现简单线性回归的具体代码,供大家参考,具体内容如下 简单的一元线性回归 一元线性回归公式: 其中x是特征:[x1,x2,x3,…,xn,]Tw是权重,b是偏置值 代码实现 导入必须的包 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np import os # 屏蔽warning以下的日志信息 os.environ['TF_CPP_MIN_LOG_LEVEL

  • python简单批量梯度下降代码

    简单批量梯度下降代码 其中涉及到公式 alpha表示超参数,由外部设定.过大则会出现震荡现象,过小则会出现学习速度变慢情况,因此alpha应该不断的调整改进. 注意1/m前正负号的改变 Xj的意义为j个维度的样本.下面为代码部分 import numpy as np #该处数据和linear_model中数据相同 x = np.array([4,8,5,10,12]) y = np.array([20,50,30,70,60]) #一元线性回归 即 h_theta(x)= y= theta0 +

  • 有关Tensorflow梯度下降常用的优化方法分享

    1.tf.train.exponential_decay() 指数衰减学习率: #tf.train.exponential_decay(learning_rate, global_steps, decay_steps, decay_rate, staircase=True/False): #指数衰减学习率 #learning_rate-学习率 #global_steps-训练轮数 #decay_steps-完整的使用一遍训练数据所需的迭代轮数:=总训练样本数/batch #decay_rate-

  • Tensorflow实现神经网络拟合线性回归

    本文实例为大家分享了Tensorflow实现神经网络拟合线性回归的具体代码,供大家参考,具体内容如下 一.利用简单的一层神经网络拟合一个函数 y = x^2 ,其中加入部分噪声作为偏置值防止拟合曲线过拟合 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 生成-0.5到0.5间均匀发布的200个点,将数据变为二维,200行一列的数据 x_data = np.linspace(-0.5, 0.5

  • Tensorflow 实现线性回归模型的示例代码

    目录 1.线性与非线性回归 案例讲解 1.数据集 2.读取训练数据Income.csv并可视化展示 3.利用Tensorflow搭建和训练神经网络模型[线性回归模型的建立] 4. 模型预测 1.线性与非线性回归 线性回归 Linear Regression:两个变量之间的关系是一次函数关系的——图像是直线,叫做线性.线性是指广义的线性,也就是数据与数据之间的关系,如图x1. 非线性回归:两个变量之间的关系不是一次函数关系的——图像不是直线,叫做非线性,如图x2. 一元线性回归:只包括一个自变量和

  • 利用Pytorch实现简单的线性回归算法

    最近听了张江老师的深度学习课程,用Pytorch实现神经网络预测,之前做Titanic生存率预测的时候稍微了解过Tensorflow,听说Tensorflow能做的Pyorch都可以做,而且更方便快捷,自己尝试了一下代码的逻辑确实比较简单. Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量),对于这些概念我也是一知半解,tensor和向量,矩阵等概念都有交叉的部分,下次有时间好好补一下数学的基础知识,不过现阶段的任务主要是应用,学习掌握思维和方法即可,就不再

随机推荐