関数の勾配ベクトルと等高線は直交する。

このタイトルでは、突然何のことか、と思われてしまいますが、サポートベクターマシン(SVM)という機械学習の勉強を始めたら「ラグランジュの未定乗数法」というのが登場しました。これは以前も見たことがある手法ですが、よくよく考えてみるとなぜこれでうまく計算できるのか私にはさっぱり分からないことに気付きました。Wikipediaに解説が載っていたので読んだのですが、いまひとつ理解できません。いろいろ考えているうちに「関数の勾配ベクトルと等高線は直交するんだろうか?」という疑問が出てきました。そして、このことが正しければWikipediaに出ているラグランジュ未定乗数法の説明は理解出来る、と思いました。そこでさらに、「関数の勾配ベクトルと等高線は直交する」ということをネットで調べたら、いい説明に出会いました。

以下、そこの記事そのままではなく、自分の理解に従っての書き方ですが、自分へのメモ用にこのことの証明を以下に記します。

証明

関数fのグラフz=f(x,y)z=ccは定数)とすると、

  • c=f(x,y)・・・・(1)

となり、これは高さcの等高線となる、この等高線の中の任意の1点を選び、これを(a,b)で表す。すると(1)より

  • c=f(a,b)・・・・(2)

である。一方、z=f(x,y)の点(a,b)における接平面は、以下のように書ける。

  • z=f(a,b)+\left[\frac{\partial{f}}{\partial{x}}\right]_{(a,b)}(x-a)+\left[\frac{\partial{f}}{\partial{y}}\right]_{(a,b)}(y-b)・・・・(3)

ただし、[\partial{f}/\partial{x}]_{(a,b)}は、点(a,b)における\partial{f}/\partial{x}の値、[\partial{f}/\partial{y}]_{(a,b)}は、点(a,b)における\partial{f}/\partial{y}の値を表す。この接平面の高さcの等高線は(3)から

  • c=f(a,b)+\left[\frac{\partial{f}}{\partial{x}}\right]_{(a,b)}(x-a)+\left[\frac{\partial{f}}{\partial{y}}\right]_{(a,b)}(y-b)

となる。ここで(2)を用いると、

  • \left[\frac{\partial{f}}{\partial{x}}\right]_{(a,b)}(x-a)+\left[\frac{\partial{f}}{\partial{y}}\right]_{(a,b)}(y-b)=0・・・・(4)

となる。ここで図形的に考えると、接平面の等高線(3)は、f(x,y)の等高線(1)の点(a,b)における接線になっていることが分かる。(x,y)は接線上の点であるから、ベクトル

  • \left[\begin{array}x-a\\y-b\end{array}\right]

は、点(a,b)から点(x,y)へのベクトルであり、つまりこれは等高線(1)の点(a,b)における接ベクトルである。一方、

  • \left[\begin{array}[\partial{f}/\partial{x}]_{(a,b)}\\[\partial{f}/\partial{y}]_{(a,b)}\end{array}\right]^T

は点(a,b)における勾配ベクトルである。式(4)からこの接ベクトルと勾配ベクトルは直交していることが分かる。よって、点(a,b)において、等高線(1)と勾配ベクトルは直交している。


このように書いたものを改めて読んでみると、図を追加しないとあまり意味が分からないことに気付きました。しかし、3次元の図を描く(曲面を描く)よい方法を私はまだ知りません。これは私の課題です。