ichou1のブログ

主に音声認識、時々、データ分析のことを書く

ヘッセ行列の固有値による凸性の判定

最適化を考える時、どの方向に向かって修正していくかを決める必要がある。

扱う対象が関数化できるなら、その最大値(あるいは最小値)を求める問題に帰着するので、関数の凸性が大事な概念になってくる。

今回は2変数関数を対象に、2階偏微分であるヘッセ行列を使って凸性を調べる方法を見てみる。

以下のサイトを参考にさせていただいた。
http://www2.kaiyodai.ac.jp/~yoshi-s/Lectures/Optimization/2013/lecture_1.pdf

偏微分の順番で微分結果は変わらないので、ヘッセ行列は対称行列になる。

3パターンの関数で見てみる。

[パターン1] 狭義凸関数

ヘッセ行列が正定値(固有値が全て0より大きい)
グラフが全ての方向で丸く突き出ている

[パターン2] 凸関数(狭義凸関数ではない)

ヘッセ行列が半正定値(固有値が全て0以上)
2点を結ぶ線分とグラフが重なる部分がある

[パターン3] 凸面と凹面が混在する関数

ヘッセ行列が不定固有値が正と負の両方を持つ)


[パターン1] 狭義凸関数

f:id:ichou1:20181014084615p:plain

勾配ベクトル


\begin{eqnarray}
\nabla f(x,y) = \begin{pmatrix} 2x \\ 2y \end{pmatrix}
\end{eqnarray}


ヘッセ行列


\begin{eqnarray}
\nabla^2 f(x,y) = \begin{pmatrix} 2 & 0 \\ 0 & 2 \end{pmatrix}
\end{eqnarray}


ヘッセ行列を固有値分解する。
固有値は「2」であることを確認

> eigen(matrix(c(2, 0, 0, 2), nrow=2, ncol=2, byrow=TRUE))
eigen() decomposition
$values
[1] 2 2

$vectors
     [,1] [,2]
[1,]    0   -1
[2,]    1    0

角度を変えてみる
y軸が奥行きと重なるように見たところ

f:id:ichou1:20181014084715p:plain
x軸が奥行きと重なるように見たところ

f:id:ichou1:20181014084730p:plain

全ての方向で丸く突き出た形をしている。

[パターン2] 凸関数(狭義凸関数ではない)

f:id:ichou1:20181014085017p:plain

勾配ベクトル


\begin{eqnarray}
\nabla f(x,y) = \begin{pmatrix} 1 \\ 2y \end{pmatrix}
\end{eqnarray}


ヘッセ行列


\begin{eqnarray}
\nabla^2 f(x,y) = \begin{pmatrix} 0 & 0 \\ 0 & 2 \end{pmatrix}
\end{eqnarray}


ヘッセ行列を固有値分解する。
固有値は「2」と「0」であることを確認

> eigen(matrix(c(0, 0, 0, 2), nrow=2, ncol=2, byrow=TRUE))
eigen() decomposition
$values
[1] 2 0

$vectors
     [,1] [,2]
[1,]    0   -1
[2,]    1    0

角度を変えてみる。
y軸が奥行きと重なるように見たところ

グラフの底が、線分の形をしている。
f:id:ichou1:20181014085026p:plain
x軸が奥行きと重なるように見たところ

f:id:ichou1:20181014085039p:plain

[パターン3] 凸面と凹面が混在する関数

f:id:ichou1:20181014085301p:plain

勾配ベクトル


\begin{eqnarray}
\nabla f(x,y) = \begin{pmatrix} 2x+2y \\ 2x-2y \end{pmatrix}
\end{eqnarray}


ヘッセ行列


\begin{eqnarray}
\nabla^2 f(x,y) = \begin{pmatrix} 2 & 2 \\ 2 & -2 \end{pmatrix}
\end{eqnarray}


ヘッセ行列を固有値分解する。
固有値は「2.828427」と「-2.828427」であることを確認

> eigen(matrix(c(2, 2, 2, -2), nrow=2, ncol=2, byrow=TRUE))
eigen() decomposition
$values
[1]  2.828427 -2.828427

$vectors
           [,1]       [,2]
[1,] -0.9238795  0.3826834
[2,] -0.3826834 -0.9238795

角度を変えてみる
y軸が奥行きと重なるように見たところ

f:id:ichou1:20181014085310p:plain
x軸が奥行きと重なるように見たところ

f:id:ichou1:20181014085326p:plain

凸面と凹面が混在している。