ヘッセ行列の固有値による凸性の判定
最適化を考える時、どの方向に向かって修正していくかを決める必要がある。
扱う対象が関数化できるなら、その最大値(あるいは最小値)を求める問題に帰着するので、関数の凸性が大事な概念になってくる。
今回は2変数関数を対象に、2階偏微分であるヘッセ行列を使って凸性を調べる方法を見てみる。
以下のサイトを参考にさせていただいた。
http://www2.kaiyodai.ac.jp/~yoshi-s/Lectures/Optimization/2013/lecture_1.pdf
偏微分の順番で微分結果は変わらないので、ヘッセ行列は対称行列になる。
3パターンの関数で見てみる。
[パターン1] 狭義凸関数
ヘッセ行列が正定値(固有値が全て0より大きい)
グラフが全ての方向で丸く突き出ている
[パターン2] 凸関数(狭義凸関数ではない)
ヘッセ行列が半正定値(固有値が全て0以上)
2点を結ぶ線分とグラフが重なる部分がある
勾配ベクトル
ヘッセ行列
ヘッセ行列を固有値分解する。
固有値は「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軸が奥行きと重なるように見たところ
x軸が奥行きと重なるように見たところ
全ての方向で丸く突き出た形をしている。
[パターン2] 凸関数(狭義凸関数ではない)
勾配ベクトル
ヘッセ行列
ヘッセ行列を固有値分解する。
固有値は「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軸が奥行きと重なるように見たところ
グラフの底が、線分の形をしている。
x軸が奥行きと重なるように見たところ
[パターン3] 凸面と凹面が混在する関数