凸性 (Convexity)
基础
集合
Image Name
Image Name
Image Name
函数
def f(x): return 0.5 * x**2 # Convex def g(x): return np.cos(np.pi * x) # Nonconvex def h(x): return np.exp(0.5 * x) # Convex x, segment = np.arange(-2, 2, 0.01), np.array([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): ax.plot(x, func(x)) ax.plot(segment, func(segment),'--', color="purple") # d2l.plt.plot([x, segment], [func(x), func(segment)], axes=ax)
Jensen 不等式
性质
- 无局部极小值
- 与凸集的关系
- 二阶条件
无局部最小值
证明:假设存在 是局部最小值,则存在全局最小值 , 使得 , 则对 :
与凸集的关系
对于凸函数 ,定义集合 ,则集合 为凸集
证明:对于点 , 有 , 故
x, y = np.meshgrid(np.linspace(-1, 1, 101), np.linspace(-1, 1, 101), indexing='ij') z = x**2 + 0.5 * np.cos(2 * np.pi * y) # Plot the 3D surface d2l.set_figsize((6, 4)) ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10}) ax.contour(x, y, z, offset=-1) ax.set_zlim(-1, 1.5) # Adjust labels for func in [d2l.plt.xticks, d2l.plt.yticks, ax.set_zticks]: func([-1, 0, 1])
凸函数与二阶导数
是凸函数
必要性 ():
对于凸函数:
故:
充分性 ():
令 为 上的三个点,由拉格朗日中值定理:
根据单调性,有 , 故:
def f(x): return 0.5 * x**2 x = np.arange(-2, 2, 0.01) axb, ab = np.array([-1.5, -0.5, 1]), np.array([-1.5, 1]) d2l.set_figsize((3.5, 2.5)) fig_x, = d2l.plt.plot(x, f(x)) fig_axb, = d2l.plt.plot(axb, f(axb), '-.',color="purple") fig_ab, = d2l.plt.plot(ab, f(ab),'g-.') fig_x.axes.annotate('a', (-1.5, f(-1.5)), (-1.5, 1.5),arrowprops=dict(arrowstyle='->')) fig_x.axes.annotate('b', (1, f(1)), (1, 1.5),arrowprops=dict(arrowstyle='->')) fig_x.axes.annotate('x', (-0.5, f(-0.5)), (-1.5, f(-0.5)),arrowprops=dict(arrowstyle='->'))
Text(-1.5, 0.125, 'x')
限制条件
拉格朗日乘子法
惩罚项
欲使 , 将项 加入目标函数,如多层感知机章节中的
投影
image