コーシー・シュワルツの不等式と三角不等式

コーシー・シュワルツの不等式と三角不等式

コーシー・シュワルツの不等式

 角度による内積の定義を再掲します。
 
\[\boldsymbol{v}\cdot\boldsymbol{w}=\parallel\boldsymbol{v}\parallel\parallel\boldsymbol{w}\parallel\cos\theta\tag{1}\]
 右辺の $\cos\theta$ は $-1$ から $1$ の値に制限されるので、内積の絶対値について次の不等式が成り立ちます。
 
\[|\boldsymbol{v}\cdot\boldsymbol{w}|\ \leq\ \parallel\boldsymbol{v}\parallel\parallel\boldsymbol{w}\parallel\tag{2}\]
 この式を コーシー・シュワルツの不等式 (Cauchy–Schwarz inequality) とよびます。等号は $\boldsymbol{v}$ と $\boldsymbol{w}$ が互いに平行のとき(互いに同じ方向または逆向きであるとき)に成立します(下図)。

 コーシー・シュワルツの不等式 (Cauchy–Schwarz inequality)

 ベクトル $\boldsymbol{v}=\begin{bmatrix}2\\3\end{bmatrix}$ と $\boldsymbol{w}=\begin{bmatrix}2\\5\end{bmatrix}$ について、コーシー・シュワルツの不等式が成り立つことを確認してみます。

# リストSLA011-1

import numpy as np
from scipy.linalg import norm

# ベクトルを定義
v = np.array([2, 3])
w = np.array([2, 5])

# |v・w|を計算
a = np.abs(np.dot(v, w))

# |v||w|を計算
b = norm(v) * norm(w)

# |v||w|-|v・w| 
print("|v||w|-|v・w| = {:.3f}".format(b - a))
|v||w|-|v・w| = 0.416

 

つくりながら学ぶ! PyTorchによる発展ディープラーニング

新品価格
¥3,758から
(2019/8/21 23:29時点)

三角不等式

 内積の定義式 (1) とコーシー・シュワルツの不等式 (2) を使うと、2 つのベクトルの和についての評価式を得ることができます。
 
\[\parallel\boldsymbol{v}+\boldsymbol{w}\parallel\ \leq\ \parallel\boldsymbol{v}\parallel+\parallel\boldsymbol{w}\parallel\tag{3}\]
 これは 三角不等式 (triangle inequality) とよばれる有名な式で、三角形の一番長い辺が他の二辺の和よりも長いことを表しています(ほとんど自明の事実です)。

 三角不等式 (triangle inequality)

 等号は $\boldsymbol{v}$ と $\boldsymbol{w}$ が平行のとき(つまり三角形がつぶれて直線になるとき)に成立します。三角不等式の証明は簡単です:
 
\[\begin{align*}
\parallel\boldsymbol{v}+\boldsymbol{w}\parallel^2
&\ =\ \parallel\boldsymbol{v}\parallel^2+2\boldsymbol{v}\cdot\boldsymbol{w}+\parallel\boldsymbol{w}\parallel^2\\[6pt]
&\ \leq\ \parallel\boldsymbol{v}\parallel^2+2\parallel\boldsymbol{v}\parallel\parallel\boldsymbol{w}\parallel+\parallel\boldsymbol{w}\parallel^2\\[6pt]
&\ =\ (\parallel\boldsymbol{v}\parallel+\parallel\boldsymbol{w}\parallel)^2\end{align*}\]
 
 先ほどと同じベクトル $\boldsymbol{v}=\begin{bmatrix}2\\3\end{bmatrix}$ と $\boldsymbol{w}=\begin{bmatrix}2\\5\end{bmatrix}$ について、三角不等式が成り立つことを確認しておきます。

# リストSLA011-2

# ベクトルを定義
v = np.array([2, 3])
w = np.array([2, 5])

# |v+w|を計算
a = norm(v + w)

# |v|+|w|を計算
b = norm(v) + norm(w)

# |v|+|w|-|v+w| 
print("|v|+|w|-|v+w| = {:.3f}".format(b - a))
|v|+|w|-|v+w| = 0.046