TensorFlow学习笔记之回归问题

回归问题较简单,回归模型也是数学建模中最为简单和入门的模型。回归问题主要采用数学神经元模型来构建成神经元线性模型。搭建成功后,计算他的误差,再利用梯度下降法来优化参数得到最后的模型。

1.1神经元模型

成年人的大脑中包含了约1000亿个神经元,每个神经元通过树突获取输入信号,通过轴突传递输出信号,神经元之间相互连接构成了巨大的神经网络,从而形成了人脑感知和意思的基础。如图1.1所示。1943年Walter
Pitts通过对生物神经元的研究,剔除了模拟生物神经元机制的人工神经网络的数学模型,成为了现代深度学习的基石。

在这里插入图片描述

图1.1 生物神经元结构

线性模型的初建立

那么,神经元模型是怎样在人工智能神经网络中应用的呢?我们先把生物神经元模型抽象为1.2(a所示)的数学结构:神经元输入向量x,经过函数映射后得到输出y。θ是简单的参数。线性变换:f(x)= w T w^T wT+b 展开为标量形式:
在这里插入图片描述
**1.2(b)**可以很好的复现以上的运算逻辑,参数θ确定了神经元的状态,固定θ参数即可确定此神经元的处理逻辑。我们将神经元模型进一步的进行简化,将神经元输入节点数调整为1(即为单输入n=1),即:
y =wx+b

在这里插入图片描述
这就是线性模型的初现,我们很容易绘制出神经元的纯输出y和输入x的变化趋势,在此就不作赘述,w参数可以理解为直线的斜率,而b参数可以理解为直线的偏置。
N =1的输入有w,b两个未知数。我们只需取两个点即可求解。同理,对于N输入的线性神经元模型,只需采取N+1组不同的数据点即可。

1.2优化方法

1.2.1MSE 均方误差的计算

建立好模型后,就该考虑观测误差的问题了,我们假设观测误差变量。当当前模型的所有采样点上的预测值与真实值之间的差的平方和最小时,所对应的参数w,b构成的直线就是我们要找的最优直线

然而MSE虽然简单直接,但是面对大规模,高纬度数据的优化问题时计算效率很低,基本不可行,于是采用GD梯度下降算法来进行优化。

1.2.2GD 梯度下降算法

以三维函数为例z=f(x,y),函数分别对x,y求偏导数,则梯度f为向量 ( ∂ z ∂ x , ∂ z ∂ x ) (\frac {\partial z } {\partial x },\frac {\partial z } {\partial x}) xzxz
我们利用
在这里插入图片描述

来迭代更新x’
对于一维函数,上述向量形式可以退化成标量形式:
在这里插入图片描述
我们用梯度下降算法来求救两个参数。需要最小化的是均方误差函数,我们按照
在这里插入图片描述
的方式循环更新参数

1.3线性模型的应用

我们需将下列的数据代入线性模型再进行求解,此处温度是X,对数之后的为Y
在这里插入图片描述
我们将两列数据导入csv文件
在这里插入图片描述
再分别进行以下四个步骤

  1. 导入数据
  2. 计算误差
  3. 计算梯度
  4. 梯度更新

我们得到了以下的结果(此为迭代47次的效果)
在这里插入图片描述
最后附上代码:

# y = ax + b
def compute_error_for_line_given_points(b,a, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # computer mean-squared-error        totalError += (y - (a* x + b)) ** 2
    # average loss for each point
    return totalError / float(len(points))


def step_gradient(b_current, a_current, points, learningRate):
    b_gradient = 0
    a_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # grad_b = 2(ax+b-y)
        b_gradient += (2 / N) * ((a_current * x + b_current) - y)
        # grad_a = 2(ax+b-y)*x
        a_gradient += (2 / N) * x * ((a_current * x + b_current) - y)
    # update w'
    new_b = b_current - (learningRate * b_gradient)
    new_w = a_current - (learningRate * a_gradient)
    return [new_b, new_w]


def gradient_descent_runner(points, starting_b, starting_a, learning_rate, num_iterations):
    b = starting_b
    a = starting_a
    # update for several times
    for i in range(num_iterations):
        b, a = step_gradient(b, a, np.array(points), learning_rate)
        print("times", i, "a", a, "b", b)
    return [b, a]


def run():
    points = np.genfromtxt("data.csv", delimiter=",")
    learning_rate = 0.1
    initial_b = 0  # initial y-intercept guess
    initial_a = 0  # initial slope guess
    num_iterations = 47
    print("Starting gradient descent at b = {0}, a = {1}, error = {2}"
          .format(initial_b, initial_a,
                  compute_error_for_line_given_points(initial_b, initial_a, points))
          )
    print("Running...")
    [b, a] = gradient_descent_runner(points, initial_b, initial_a, learning_rate, num_iterations)
    print("After {0} iterations b = {1}, a = {2}, error = {3}".
          format(num_iterations, b, a,
                 compute_error_for_line_given_points(b, a, points))
          )


if __name__ == '__main__':
    run()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值