Wang Haihua
🍈 🍉🍊 🍋 🍌
本文我们将学习如何使用导数来寻找函数的最优值(最小值或最大值)及最优值点。这在应用数学、统计学和机器学习中非常重要,我们可以通过以最小化误差函数的方式拟合函数的参数来推导出强大的算法。
对于一个函数 $f(x)$.,全局最小值点(A point of global minimum) $\hat{x}$ 满足
$$ f(\hat{x}) \leq f(x) $$其中 $x$ 指的是定义域中任何数. 如果 $\hat{x}$ 是全局最小值点,那么$f(\hat{x})$ 就是函数的最小值。
我们将局部最小值点(A points of local minimum):
如果$\tilde{x}$ 是一个局部最小值点$,那么\tilde{x}$ 满足在它的邻域(从 $\tilde{x}-\delta$ 到 $\tilde{x} + \delta$的极小范围),它的函数值 $f(x)$ 是最小的。
这也意味着如果$\tilde{x}$ 如果是全局最小值点,那么它一定也是局部最小值点.
局部最大值和全局最大值(Local and global maxima)有类似定义,只需要将 $\leq$ 替换为 $\geq$即可.
全局和局部的极小值和极大值如下图所示
当一个函数$f(x)$是光滑的(即它处处可导)时,临界点$x_c$是导数$\dfrac{df(x_c)}{dx}$等于0的点。几何上来看,该点处就是函数的切线是水平的。
如果一个点是临界点,那么它要么是最大/最小点,要么是鞍点(saddle point)。鞍点的例子如下图所示。
在鞍点附近,导数的幅度逐渐减小,直到完全消失。然而,在这一点之后,函数会继续沿着之前“移动”的相同方向(继续增大或继续减小)。相反,在极大值或极小值点上,函数的变化方向是相反的,要么由增变减,要么由减变增。
我们可以通过求临界点来求最小值点和最大值点。函数$f(x)$的临界点是以下方程的解:
$$ \dfrac{df(x)}{dx} = 0 $$对于二次函数$f(x) = -3 x^2 + x - 1$
它的导数是:
$$ \dfrac{df(x)}{dx} = -6 x + 1 $$可以求出它的临界值点
$$ -6 x + 1 = 0 $$该点只有一个
$$ x_c = \dfrac{1}{6} $$因此 $x_c = \frac{1}{6}$是该函数唯一的一个临界值点。 这种情况下,很容易看出这个点是局部(和全局)最大的点。
对于三次函数$f(x) = x^3 - 2x^2 + x$
它的导数是:
$$ \dfrac{df(x)}{dx} = 3 x^2 - 4 x + 1 $$因此方程的临界点为:
$$ 3x^2 - 4 x +1 = 0 $$利用求根公式,可得到
$$ x_{\pm} = \dfrac{4 \pm \sqrt{16 - 12}}{6} = \dfrac{4 \pm 2}{6} $$因此临界值点为
$$ x_{+} = 1 $$和 $$ x_{-} = \dfrac{1}{3} $$
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import pandas as pd
import scipy.stats
plt.rcParams['font.family']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
例1
f = lambda x: -3*x**2 + x - 1
x_c = 1/6
x_range = np.linspace(-1,1,100)
plt.plot(x_range, f(x_range), label=r"$f(x)$")
plt.axvline(x_c, ls="--", c="k", label="临界值")
plt.legend(loc="best")
plt.savefig('images/cal0501.png')
例2
f = lambda x: x**3 - 2*x**2 + x
x_p = 1
x_m = 1/3
x_range = np.linspace(-0.25,1.5,100)
plt.plot(x_range, f(x_range), label="f(x)")
plt.axvline(x_p, ls="--", c="k", label="临界值点 -")
plt.axvline(x_m, ls="--", c="r", label="临界值点 +")
plt.legend(loc="best")
plt.savefig('images/cal0502.png')