范数求导

一、什么是范数

范数是一种将向量映射到非负实数的函数。对于一个n维向量x,其p范数定义为:$$\left\lVert x \right\rVert_{p} = \sqrt[p]{\sum_{i=1}^{n} {{\left\lvert x_i \right\rvert}^p}}$$ 其中,p为范数的阶数,向量中每个元素的绝对值取p次方后求和再开p次方。

通常情况下,常用的范数如下:

  • L1范数:$$\left\lVert x \right\rVert_{1}=\sum_{i=1}^{n} {\left\lvert x_i \right\rvert}$$
  • L2范数:$$\left\lVert x \right\rVert_{2}=\sqrt{\sum_{i=1}^{n} {\left\lvert x_i \right\rvert}^2}$$
  • L∞范数:$$\left\lVert x \right\rVert_{\infty}=\max_{1\leq i\leq n}{\left\lvert x_i \right\rvert}$$

二、范数的导数

范数的导数表示为范数的梯度向量,即向量各分量的导数向量。对于一个向量x,其p范数的导数为:

  • L1范数的导数:$$\frac{\partial{\left\lVert x \right\rVert_{1}}}{\partial{x_i}}=\frac{x_i}{\left\lVert x \right\rVert_{1}}$$
  • L2范数的导数:$$\frac{\partial{\left\lVert x \right\rVert_{2}}}{\partial{x_i}}=\frac{x_i}{\left\lVert x \right\rVert_{2}}$$
  • L∞范数的导数:$$\frac{\partial{\left\lVert x \right\rVert_{\infty}}}{\partial{x_i}}=\begin{cases} 1,\left\lvert x_i \right\rvert=\left\lVert x \right\rVert_{\infty} \\0,\left\lvert x_i \right\rvert\neq\left\lVert x \right\rVert_{\infty} \end{cases}$$

具体来说,L1范数可视为L2范数在原点与目标点的曼哈顿距离,而L2范数则是在原点与目标点的欧几里得距离。因此,L1范数的导数在原点的分量不唯一,而L2范数则有唯一的梯度向量。L∞范数则是在各分量差值中取最大值作为距离,其导数在最大值处分量为1,其他处为0。

三、范数求导的应用

范数求导在优化问题中有着广泛的应用,主要用于对目标函数的求导。一些常用的应用如下:

  • 正则化:在模型训练中引入范数正则化可以使得模型的泛化性能更好。例如,L1正则化可以实现特征选择,L2正则化可以防止过拟合。
  • 稀疏表示:通过使问题的解具有更大的结构性,使得问题变得更加容易求解。例如,对于二次规划问题C(x)的目标函数,一个常见的目标是最小化L1范数,即:$$\min \left\lVert x \right\rVert_{1}\quad \text{s.t.}\quad C(x)\leq0$$

四、代码示例

<?php
/**
 * 计算向量的Lp范数
 *
 * @param array $vector 向量数组
 * @param int $p 范数的阶数
 *
 * @return float
 */
function norm(array $vector, int $p = 2): float
{
    $sum = 0;
    foreach ($vector as $item) {
        $sum += pow(abs($item), $p);
    }
    return pow($sum, 1 / $p);
}

/**
 * 计算向量的导数
 *
 * @param array $vector 向量数组
 * @param int $p 范数的阶数
 *
 * @return array
 */
function grad(array $vector, int $p = 2): array
{
    $g = [];
    $n = norm($vector, $p);
    foreach ($vector as $i => $item) {
        switch ($p) {
            case 1:
                $g[$i] = $item === 0 ? 0 : $item / $n;
                break;
            case 2:
                $g[$i] = $item / $n;
                break;
            default:
                $g[$i] = abs($item) === $n ? ($item > 0 ? 1 : -1) : 0;
        }
    }
    return $g;
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/154277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-15 03:26
下一篇 2024-11-15 03:26

相关推荐

  • diff函数是否能够实现数值求导?

    答案是可以的。下面将从数学原理、实现过程和可行性三个方面对此进行详细阐述。 一、数学原理 求导的定义是函数在某一点的变化率,也即在该点处的斜率。而数值求导便是使用有限差分近似求解该…

    编程 2025-04-28
  • 用python求导怎么求,python求导数调用什么库

    本文目录一览: 1、python求导用哪个库 2、如何使用Python求导? 3、如何使用Python求导 4、如何用python求导数 5、Python如何通过函数导数值求出原函…

    编程 2025-01-13
  • 从多个方面详细阐述LaTeX求导

    一、LaTeX求导基础 LaTeX是一种非常适合于数学公式排版的工具,也因此在求导方面应用十分广泛。 LaTeX求导的公式由 \frac{dy}{dx} 来表示,其中y为被求导函数…

    编程 2024-11-26
  • Python求导实现

    引言 在数学中,求导(Derivative)是指函数对自变量的变化率。对函数进行求导能够揭示函数的性质、极值、斜率等信息。然而在实际生活中,求导的具体计算显得极为繁琐和复杂。Pyt…

    编程 2024-11-25
  • 深入理解softmax求导

    一、简介 softmax函数是在深度学习和神经网络中常用的函数,主要用于多分类问题和概率分布。在反向传播算法中,softmax函数的求导是一个非常重要的过程,本文将从多个方面阐述s…

    编程 2024-11-21
  • 多项式求导探究

    一、多项式求导方法 多项式求导是高等数学中的一个重要概念,它广泛应用于科学技术以及各种工程领域。求导是求函数导数的过程,对于多项式来说,求导其实就是求多项式的导数。在求导之前,需要…

    编程 2024-10-08

发表回复

登录后才能评论