以下の本を読みます。キャラクターは架空のものです。解釈の誤りは筆者に帰属します。お気付きの点がありましたらコメント等でご指摘いただけますと幸いです。
カーネル法入門―正定値カーネルによるデータ解析 (シリーズ 多変量データの統計科学)
- 作者: 福水健次
- 出版社/メーカー: 朝倉書店
- 発売日: 2010/11/01
- メディア: 単行本
- クリック: 19回
- この商品を含むブログ (11件) を見る
前回のあらすじをまとめると、
- データを分析するには(つまり、ある変数とある変数が依存し合っているかを調べたり、それに基づいて回帰したり分類したりするには)、線形な依存性のみを調べるのでは不十分なこともあるので、非線形な依存性も調べたい。
- 言い換えると、データを なる特徴写像で特徴空間 に写像することで非線形な特徴も引き出して、この特徴空間で分析をしたい。
- しかし、あらゆる高次項を特徴に追加したのでは、組み合わせが爆発してしまい、主成分分析のために標本共分散行列の固有値分解をしたり、回帰分析のためにデータ行列の擬似逆行列を求めたりすることができない。
- が、少なくとも特徴空間における主成分分析は、行列の各成分が であるような行数と列数がデータサイズの(有限の大きさの)行列の2乗の固有値分解をすることで達成できる。ので、 の値さえ評価できればよいことになる。ここでポイントとなったのは、
- 特徴空間における第1主軸 は の形でかける(もしかけない成分があったら、かけない成分をゼロにしてその分かける成分を引き伸ばした方が各データの との内積の分散が大きくなる)。
- そうすると解くべき最大化問題の中にデータは の形でしか出てこない。
カーネルトリックというくらいだからね。
しかし、 は から探せば十分、というのは通常の主成分分析でも成り立つ話ですよね? 通常の主成分分析の言葉でいうと、第1主軸 を求めるのに、 をあらゆる向きの 次元単位ベクトルから探すのではなくて、 でかけるものを探せば十分、ということになりますよね。
あー、元データの次元数 よりデータサイズ の方が大きければかえって計算量が大きくなってしまいますね…。8ページからは主成分分析からまた変わって、リッジ回帰という例がありますね。リッジ回帰とは、線形モデルを最小2乗フィッティングするのにパラメータベクトルのL2ノルムの2乗に比例する正則化項を付けて、「誤差2乗和を小さくするパラメータベクトルを求めよ。ただし、パラメータベクトルのL2ノルムの2乗は小さく抑えること」といったもののようですね。その解 は…「容易に求められるように」? 何気ない「容易に」が読者を傷つけるのでは?
まあそこまで説明してもらえばわかります。その式の下の、リッジ回帰はどんなときに利用されるかというので、「 が退化していたり」というのは何ですか?
が正則でないというのは、 の階数が に満たない、さらに言い換えると の階数が に満たないって状況だね。そうなっちゃうのは以下のようなときかな。
- データ数 を上回るほど、データの次元 が巨大であるとき。
- データセットが線型従属なとき(例えば、同じ点が重複して含まれているとか)。
※ | 厳密には、もし が固有値 をもっていたら、正則化項を導入しても は正則になりません。が、ピンポイントでそうなることはあまりないのではないかと思っています。 |
なるほど…誤差2乗和のみでは回帰係数が選びきれないときでも選ぶ基準を新たに与えたんですね。原点を底にしたお椀ということは「選べなかったら原点になるべく近い解にしといて」って感じですよね…?
そうだね。ちなみに、L2ノルムのお椀は Figure 3.4 の左側の赤い等高線のように丸いけど、L1ノルムのお椀はその右側のようにひし形をしてるね。お椀っていうかひっくり返した四角錐だね。だから、L1ノルムで正則化するラッソ回帰では一部の成分がゼロになるような解が求まりやすい。この図でも の点が解になってるね。
じゃあラッソ回帰は「なるべく平面 に貼り付く解にしといて」って感じですかね。…まあラッソ回帰は置いておいて、今回はリッジ回帰を特徴空間でやりたいわけです。特徴空間でのリッジ回帰の目的関数は式 (1.9) ですね。また特徴空間 での内積とノルムが出てきていますね…。
データ空間でやっていた「 の各成分を回帰係数 で足し合わせてそれを予測値としようとする」というのは、特徴空間 でやろうとすると「 とベクトル との内積をとってそれを予測値をしようとする」ということだからね。
しかし というベクトルはいま得体の知れないもので、カーネルPCAのときは最終的に は排除されたのですよね。リッジ回帰ではどうなるのでしょう。リッジ回帰でも解は の形でかけるとありますね。
もし に直交補空間の成分 があったらそれを丸々削った方が正則化項の が抑えられるからね。
全くですね。ということは…今回もまた最小化したい式の中にデータは の形でしか出てきませんね。 は出てきません。
最適化問題中の を意地でも の形にするために、 から を絞り出したって考えればそんなに降って湧いてもないんじゃないかな。
そもそも非線形な依存性を調べたくて などという特徴写像を持ち出したのですから、どのような が可能なのかが肝心な気がしますが…。ところで今回カーネルリッジ回帰を学びましたが、python の scikit-learn でカーネルリッジ回帰ができるようなので実行してみます。iris データの全品種ごちゃ混ぜで、がく片の長さからがく片の幅を予測するという何がしたいのかわからない例ですが…カーネル関数 には色々なものが指定できるし、自分で実装したものを渡すこともできそうです。組み込みのものを利用するときはおそらく以下の pairwise.kernel_metrics にあるものが指定できると思います。以下のスクリプトではいじっていませんが、パラメータも変更できます。
スクリプト
import numpy as np from sklearn.kernel_ridge import KernelRidge from sklearn.datasets import load_iris %matplotlib inline import matplotlib.pyplot as plt from pylab import rcParams rcParams['figure.figsize'] = 8, 6 rcParams['font.size'] = 16 iris = load_iris() #x = np.array(iris['data'][:,0][iris['target']==0]) # setosa の sepal length (cm) #y = np.array(iris['data'][:,1][iris['target']==0]) # setosa の sepal width (cm) x = np.array(iris['data'][:,0]) # sepal length (cm) y = np.array(iris['data'][:,1]) # sepal width (cm) print(x.shape) print(y.shape) x = x.reshape(-1, 1) y = y.reshape(-1, 1) print(x.shape) print(y.shape) # ----- オリジナル ----- plt.scatter(x, y, label='original') # ----- linearカーネル ----- kr = KernelRidge(kernel='linear') kr.fit(x, y) plt.scatter(x, kr.predict(x), label='predict(linear)') # ----- polyカーネル ----- kr = KernelRidge(kernel='poly') kr.fit(x, y) plt.scatter(x, kr.predict(x), label='predict(poly)') # ----- rbfカーネル ----- kr = KernelRidge(kernel='rbf') kr.fit(x, y) plt.scatter(x, kr.predict(x), label='predict(rbf)') plt.legend() plt.show()
(150,) (150,) (150, 1) (150, 1)