深度学习 回归问题

1. 梯度下降算法

深度学习中, 梯度下降算法是是一种很重要的算法.

梯度下降算法与求极值的方法非常类似, 其核心思想是求解 x ′ x' x′, 使得 x ′ x' x′ 在取 x ⋆ x^{\star} x⋆ 时, 可以使得 l o s s 函数 loss函数 loss函数 的值最小.

其中, 在求解 x ′ x' x′ 的过程中, 采用的是迭代的方法, 不断迭代逼近 $ x^{\star}$. 最基本的公式为:
x ′ = x − l r × ▽ x x' = x - lr \times \triangledown x x′=x−lr×▽x

其中 ▽ x \triangledown x ▽x为 l o s s ′ ∣ x loss'|_{x} loss′∣x , l r lr lr 为学习率, 以上述公式为基础,发展出了更多的求解器.

2. 噪声

在现实世界中, 数据总是会存在误差.
y = w ∗ x + b + ϵ ϵ ∼ N ( 0.01 , 1 ) y = w * x + b + \epsilon \enspace\enspace \epsilon \sim {N(0.01, 1)} y=w∗x+b+ϵϵ∼N(0.01,1)

l o s s = ( W X + b − y ) 2 loss = (WX + b - y)^2 loss=(WX+b−y)2

3. 回归与分类

3.1 线性回归

预测范围为实数区间.

3.2 逻辑回归

加了压缩函数后, 压缩了预测范围[0, 1].

3.3 分类

如手写数字识别.

4. 优化

y = w x + b + ϵ y = wx + b + \epsilon y=wx+b+ϵ中, 通过已有的 x i x_i xi y i y_i yi求解 w w w ϵ \epsilon ϵ, 可以优化为以下问题:

5. 回归问题实践

5.1 计算给定点的误差

代码如下所示:

python 复制代码
def compute_error_for_line_given_points(b, w, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]  # 获取当前点的x坐标
        y = points[i, 1]  # 获取当前点的y坐标
        # 计算预测值与实际值之间的差的平方,并累加到总误差中
        totalError += (y - (w * x + b)) ** 2
        # 返回平均误差
    return totalError / float(len(points))

5.2 计算梯度下降的梯度, 更新b和w

代码如下所示:

python 复制代码
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和w的梯度
        # 梯度计算
        b_gradient += -(2 / N) * (y - (w_current * x + b_current))
        w_gradient += -(2 / N) * x * (y - (w_current * x + b_current))
    # 使用学习率更新b和w
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]

5.3 执行梯度下降算法, 迭代b和w

代码如下所示:

python 复制代码
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m  # 通常w用于表示斜率,但这里用m,可能是为了与初始变量名保持一致
    for i in range(num_iterations):
        b, m = step_gradient(b, m, np.array(points), learning_rate)
    return [b, m]

5.4 完整代码

python 复制代码
import torch  # 导入torch库,但在此代码中未直接使用
import numpy as np  # 导入numpy库,用于处理数值数据


# 计算给定直线(由参数b和w定义)对于一组点的误差
def compute_error_for_line_given_points(b, w, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]  # 获取当前点的x坐标
        y = points[i, 1]  # 获取当前点的y坐标
        # 计算预测值与实际值之间的差的平方,并累加到总误差中
        totalError += (y - (w * x + b)) ** 2
        # 返回平均误差
    return totalError / float(len(points))


# 计算梯度下降中的梯度,并更新直线参数b和w
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和w的梯度
        # 梯度计算
        b_gradient += -(2 / N) * (y - (w_current * x + b_current))
        w_gradient += -(2 / N) * x * (y - (w_current * x + b_current))
    # 使用学习率更新b和w
    new_b = b_current - (learningRate * b_gradient)
    new_w = w_current - (learningRate * w_gradient)
    return [new_b, new_w]


# 执行梯度下降算法以优化直线参数
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m  # 通常w用于表示斜率,但这里用m,可能是为了与初始变量名保持一致
    for i in range(num_iterations):
        b, m = step_gradient(b, m, np.array(points), learning_rate)
    return [b, m]


# 主函数,用于运行梯度下降算法
def run():
    points = np.genfromtxt("data.csv", delimiter=",")  # 从CSV文件加载数据点
    learning_rate = 0.0001  # 设置学习率
    initial_b = 0  # 初始截距
    initial_m = 0  # 初始斜率(这里用m代替w)
    num_iterations = 1000  # 设置迭代次数
    # 在开始梯度下降之前,计算并打印初始误差
    print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
          .format(initial_b, initial_m,
                  compute_error_for_line_given_points(initial_b, initial_m, points)))
    print("Running...")
    # 执行梯度下降
    [b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)
    # 打印梯度下降后的结果和最终误差
    print("After {0} iterations b = {1}, w ={2}, error = {3}"
          .format(num_iterations, b, m,
                  compute_error_for_line_given_points(b, m, points))
          )


if __name__ == '__main__':
    run()  # 调用主函数
相关推荐
Tianyanxiao37 分钟前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售
撞南墙者44 分钟前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
OCR_wintone4211 小时前
易泊车牌识别相机,助力智慧工地建设
人工智能·数码相机·ocr
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
一者仁心1 小时前
【AI技术】PaddleSpeech
人工智能
是瑶瑶子啦1 小时前
【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)
论文阅读·人工智能·深度学习·视觉检测·空间变换
EasyCVR1 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
柳鲲鹏2 小时前
OpenCV视频防抖源码及编译脚本
人工智能·opencv·计算机视觉
西柚小萌新2 小时前
8.机器学习--决策树
人工智能·决策树·机器学习
向阳12182 小时前
Bert快速入门
人工智能·python·自然语言处理·bert