【深度学习_TensorFlow】线性回归

写在前面

本篇文章开始,我们就开始了解深度学习,开启一段新的旅程!

作为初学者,学习起来还是比较有难度的,在本篇文章中我将尽己所能,将复杂的知识简明扼要的归纳概括,兼顾理论与实践的结合,同时文章难免会有疏漏以及错误之处,各位看官对有疑问的地方可以在评论区交流哦!

写在中间

理论基础

1. 简单介绍

​ 在机器学习领域中的大部分任务都与预测相关,此时就会涉及回归问题分类问题,本文章简单讲解回归问题。现实生活中的应用有很多,就拿预测股票来举例,可以用线性回归制作模型来预测股票变动,我们来做可能不会准确,因为这其中涉及很多专业知识,但是学会制作回归方程的方法还是有必要的!

2. 操作方法

y = ω x + b y=\omega x+b y=ωx+b ω \omega ω 称为权重,b 称为偏置。

接下来的任务就围绕这个公式展开:

  • 损失函数

    这是我们用来评价求解出的回归方程质量的一种方法,和中学时期学习的残差(真实值与预测值之间的差距,即 e = y − y ^ e=y-\widehat{y} e=yy )比较相似,用公式表示就为 l o s s = ∑ 1 n ( y i − ( ω x i + b ) ) 2 loss=\sum_{1}^n (y_i-(\omega x_i+b))^2 loss=1n(yi(ωxi+b))2

    不同的书对其有不同的称呼,均方误差(多乘个 1 n \frac{1}{n} n1)、平法误差等

  • 梯度下降法求解参数

    这种方法就可以求出这两个参数:

    ω = ω − l r ∗ ∂ l o s s ∂ ω \omega=\omega-lr*\frac{\partial loss}{\partial \omega} ω=ωlrωloss

    b = b − l r ∗ ∂ l o s s ∂ b b=b-lr*\frac{\partial loss}{\partial b} b=blrbloss

    其中,lr (learn_rate) 表示“学习率”

  • 不断更新参数,最终得到两个最终的结果

代码实践

下面是相关代码配上详细的注释,建议查询一下formatgenfromtxt等库函数的用法,代码功能更能一目了然。

import numpy as np

# y = wx + b
def compute_error_for_line_given_points(b, w, points):
    """
    计算给定的点与直线之间的误差平方和
    参数:
    b (float): y轴截距
    w (float): 直线的斜率
    points (ndarray): 包含n个点坐标的数组,每个点坐标为[x, y]
    返回值:
    float: 平均每个点的误差平方和
    """
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        totalError += (y - (w * x + b)) ** 2
    return totalError/float(len(points))


def step_gradient(b_current, w_current, points, learningRate):
    # 初始化梯度
    b_gradient = 0
    w_gradient = 0
    # 数据点数量
    N = float(len(points))
    # 对每一个数据点,求解梯度
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # 求解b的梯度 grad_b = 2(wx+b-y),求平均值可以让数值小一点
        b_gradient += (2/N) * ((w_current * x + b_current) - y)
        # 求解w的梯度 grad_w = 2(wx+b-y)*x
        w_gradient += (2/N) * x * ((w_current * x + b_current) - y)
    # 更新b和w
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    # 返回更新后的b和w
    return [new_b, new_w]


def gradient_descent_runner(points, starting_b, starting_w, learning_rate, num_iterations):
    # 初始化截距和斜率
    b = starting_b
    w = starting_w
    # 迭代更新参数
    for i in range(num_iterations):
        # 通过梯度下降更新截距和斜率
        b, w = step_gradient(b, w, np.array(points), learning_rate)
    # 返回更新后的截距和斜率
    return [b, w]

def run():
    # 从data.csv中读取数据,使用逗号作为分隔符,存入二维数组points中
    points = np.genfromtxt("data.csv", delimiter=",")
    # 学习率
    learning_rate = 0.0001
    # 猜测y轴截距的初值
    initial_b = 0
    # 猜测斜率的初值
    initial_w = 0
    # 迭代次数
    num_iterations = 1000
    # 输出初始猜测及其对应的误差
    print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
          .format(initial_b, initial_w,
                  compute_error_for_line_given_points(initial_b, initial_w, points))
          )
    # 输出正在运行的提示
    print("Running...")
    # 执行梯度下降算法,并返回最优解b和w
    [b, w] = gradient_descent_runner(points, initial_b, initial_w, learning_rate, num_iterations)
    # 输出最优解及其对应的误差
    print("After {0} iterations b = {1}, w = {2}, error = {3}".
          format(num_iterations, b, w,
                 compute_error_for_line_given_points(b, w, points))
          )


if __name__ == '__main__':
    run()

写在最后

👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值