Datawhale AI x 魔搭 夏令营第五期 深度学习(入门)方向 task02笔记

今日目标

学习线性模型,根据例子能够更深刻的了解该模型的应用以及优缺点。

线性模型

基本介绍(从网上截取)

线性模型是机器学习中的一种基础且重要的模型,它的核心思想是通过将输入特征线性组合来预测输出结果。线性模型具有形式简洁、易于建模的优点,并且蕴含着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层次结构或高维映射而得。线性模型的表达式可以表示为 y = w^T * x + b,其中 w 和 b 是模型的参数,x 是输入特征向量,y 是预测结果。线性模型试图学习一个通过属性的线性组合来进行预测的函数。这里的“线性”指的是一系列一次特征的线性组合,在二维空间中表现为直线,在三维空间中表现为平面,推广到 n 维空间,这就是广义的线性模型。

简单线性回归和多元线性回归

简单线性回归:

我们可以以房屋面积(x)与房价(y)为例,二者是线性关系,房屋价格正比于房屋面积,假设比例为w:然而,这种线性方程一定是过原点的,即x为0时,y也一定为0。这可能并不符合现实中某些场景。为了能够让方程具有更广泛的适应性,就要再增加一个截距,设为b,则方程可以变为:以上方程就是数据建模的模型,w与b就是模型的参数。
线性回归是用来解释自变量与因变量之间的关系,但这种关系并非严格的函数映射关系。

多元线性回归:

现实中的数据可能是比较复杂的,自变量也可能不止一个,例如,影响房屋价格也很可能不止房屋面积一个因素,可能还有是否在地铁附近,房间数,层数,建筑年代等诸多因素。不过,这些因素对房价影响的权重是不同的,因此,我们可以使用多个权重来表示多个因素与房屋价格的关系:x:影响因素,即特征。
w:每个x的影响力度。
n:特征的个数。
y^:房屋的预测价格。

分线段性曲线

基本定义

分线段性曲线(Piecewise Linear Curve)是一种由若干线段组成的曲线,它在不同区间内由不同的线性函数描述。这种曲线在数学、计算机图形学和工程等领域有广泛的应用。下面详细介绍一下分线段性曲线的概念、构造和应用。

特点

  1. 分段线性:在每个子区间内,函数是线性的。
  2. 易于计算:由于每个区间内的函数是线性的,因此计算非常简单。
  3. 局部性:每个线段的定义仅依赖于相邻的两个分段点,便于局部修改。
  4. 可能的不连续性:在分段点处,曲线的导数可能不连续。

应用领域

  1. 数据插值:在数值分析和计算机图形学中,分线段性曲线常用于对离散数据点进行插值。
  2. 信号处理:用于近似复杂信号,从而简化分析和处理。
  3. 数值积分:用于分段近似复杂函数,便于计算积分值。
  4. 计算机图形学:绘制折线图和多边形边界。
  5. 工程分析:用于结构分析和动态系统建模。

构造步骤

  1. 确定分段点:选择并确定需要分段的点 \( x_1, x_2, \ldots, x_{n+1} \)。
  2. 计算线段系数:对于每个分段区间 \([x_i, x_{i+1}]\),计算出对应的线性函数 \( y = ax + b \)。
  3. 连接线段:将每个分段的线性函数按顺序连接起来,形成完整的分段线性曲线。

简单的代码实现 

import matplotlib.pyplot as plt

# 定义数据点
points = [(1, 2), (3, 3), (4, 1)]

# 提取 x 和 y 坐标
x_coords, y_coords = zip(*points)

# 计算线段
segments = []
for i in range(len(points) - 1):
    x1, y1 = points[i]
    x2, y2 = points[i+1]
    a = (y2 - y1) / (x2 - x1)
    b = y1 - a * x1
    segments.append((a, b, x1, x2))

# 定义分段函数
def piecewise_linear(x):
    for a, b, x1, x2 in segments:
        if x1 <= x <= x2:
            return a * x + b
    return None  # 如果 x 不在任何区间内

# 创建 x 轴的值
x_values = [x / 100 for x in range(100, 401)]

# 计算 y 轴的值
y_values = [piecewise_linear(x) for x in x_values]

# 绘制图形
plt.plot(x_values, y_values, label='Piecewise Linear Curve')
plt.scatter(x_coords, y_coords, color='red', label='Data Points')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Piecewise Linear Curve')
plt.grid(True)
plt.show()

 解释

1. 导入库:首先导入`matplotlib.pyplot`用于绘图。
2. 定义数据点:定义分段线性曲线的数据点。
3. 提取坐标:从数据点中提取x和y坐标。
4. 计算线段:根据每两个相邻的数据点,计算每段线性函数的系数`a`和`b`。
5. 定义分段函数:定义一个函数,用于在给定x值时返回相应的y值。
6. 创建x轴的值:生成从1到4的x值列表。
7. 计算y轴的值:根据x值列表,计算对应的y值。
8. 绘制图形:绘制分段线性曲线和数据点,并添加标签和网格。

 修正线性单元(来自chat而非课本)

修正线性单元(ReLU, Rectified Linear Unit)是一种常用于神经网络中的激活函数。它的公式定义为:

\[ \text{ReLU}(x) = \max(0, x) \]

也就是说,对于输入 \( x \),如果 \( x \) 大于 0,则输出 \( x \);否则输出 0。ReLU 是一种非线性激活函数,尽管它的形式相对简单,但在实际应用中表现出了优越的性能。

ReLU 的特点和优势

  1. 计算简单:ReLU 的计算只涉及简单的比较和选择操作,计算速度非常快。
  2. 非线性:虽然形式简单,但 ReLU 是非线性的,这使得神经网络能够学习和表示复杂的函数。
  3. 梯度消失问题的缓解:相比于 Sigmoid 和 Tanh 激活函数,ReLU 在正区间上的梯度恒为 1,不会因为激活函数的饱和导致梯度消失(vanishing gradient)问题。
  4. 稀疏激活:ReLU 会将部分神经元的输出设为0,这种稀疏激活有助于提高模型的泛化能力。

ReLU 的变种

尽管 ReLU 有许多优点,但也存在一些缺点,如“死神经元”问题(当权重更新使得神经元的输入恒为负值时,该神经元将永远不会被激活)。为了克服这些问题,研究者提出了一些 ReLU 的变种:

  1. Leaky ReLU

    • 公式:\[ \text{Leaky ReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases} \]
    • 其中 \( \alpha \) 是一个小常数,通常取值在 0.01 左右。
    • 优点:在负区间上保留了一些梯度信息,可以缓解死神经元问题。
  2. Parametric ReLU (PReLU)

    • 公式:\[ \text{PReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases} \]
    • 其中 \( \alpha \) 是一个可训练的参数。
    • 优点:通过学习负区间的斜率,使得模型能够更好地适应数据。
  3. Exponential Linear Unit (ELU)

    • 公式:\[ \text{ELU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases} \]
    • 其中 \( \alpha \) 是一个超参数。
    • 优点:在负区间上具有更好的平滑性,可以提高模型的训练速度和精度。
  4. Scaled Exponential Linear Unit (SELU)

    • 公式:\[ \text{SELU}(x) = \lambda \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases} \]
    • 其中 \( \lambda \) 和 \( \alpha \) 是预先设定的常数。
    • 优点:SELU 可以自动实现自归一化(self-normalizing),使得网络在训练过程中保持稳定。

RelU的实现 

import numpy as np

# ReLU
def relu(x):
    return np.maximum(0, x)

# Leaky ReLU
def leaky_relu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)

# PReLU
def prelu(x, alpha):
    return np.where(x > 0, x, alpha * x)

# ELU
def elu(x, alpha=1.0):
    return np.where(x > 0, x, alpha * (np.exp(x) - 1))

# SELU
def selu(x, lambda_=1.0507, alpha=1.67326):
    return lambda_ * np.where(x > 0, x, alpha * (np.exp(x) - 1))

# 示例输入
x = np.array([-2, -1, 0, 1, 2])

print("ReLU:", relu(x))
print("Leaky ReLU:", leaky_relu(x))
print("PReLU:", prelu(x, alpha=0.1))
print("ELU:", elu(x))
print("SELU:", selu(x))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值