北野坂備忘録

主にインストールやプログラミングのメモを載せています。

(カーネル法における)カーネル関数とは何か 

Wikipediaしましま先生 の「カーネル」の項目を読んで、
「分からんわ-!」
 と叫びながら壁に頭を打ちつけ続けたみなさん、こんにちは。

 あなたは正常です。

 いったい日本人のうちの何人があれを見て
「あっ、カーネル関数ってこういうことなんだー!」
 と分かるのでしょうか。いることはいると思いますが。

 はい、というわけで「カーネル関数」の説明です。ややこしいことに「カーネル関数」は「カーネル」とだけ書かれることもあります。あと、「核関数」と表現されることもあります。

 まずはカーネル法の話をします。
 カーネル法は2つの工程に分かれます。
 1つ目は、
1. 線形分離不可能なデータ構造を
2. 高次元への写像関数を使って高次元空間へ写像することで
3. 線形分離可能な構造に変換すること。
 です。つまり「高次元に写像して線形分離可能にする工程」です。
 2つ目は「カーネルトリック」で、この「高次元に写像して線形分離可能にする方法」で発生する高コストな写像関数の計算を、
・「写像関数」を直接使わずに「カーネル関数」を使って間接的に高次元のデータについて低コストで計算処理を行う方法
 のことです。「特徴空間での変数を陽に扱わない」という不思議な日本語で表されることも多いアレです。
 ここまでは理解できている人も多いと思います。

 で、「カーネル関数」と言うと「内積」「内積」と思われがちですが、別に内積計算するものだけがカーネル関数ではありません
 「カーネル関数」とは本来「2つのデータの間のある種の類似度を表す」関数のことです。
 黄色本の上巻には「内積でないカーネル関数」の良い例(Parzen窓)が掲載されています。
 
 しかしながら、カーネル法に使えるカーネル関数は限られています。カーネル関数ならなんでもいいわけではないのです。
 カーネル関数k(x,x')がカーネル法で有効なカーネル関数である十分条件は、
・対称性を持つこと & 半正定値性を持つこと
=任意の{x_n}に対して、要素がk(x_n,x_m)で与えられるグラム行列Kが半正定値であること

 グラム行列Kが半正定値であるカーネル「半正定値カーネルと言います。カーネル法の文脈では「半」が無視されて「正定値カーネル」と書かれることのほうが多いです。グラム行列はN×N対称行列なのでグラム行列と言った時点で対称性も満たされます。

 というわけで、上記のカーネルトリックの定義を少し修正します。
・「写像関数」を使わずに「半正定値カーネルを使って間接的に高次元のデータについて低コストで計算処理を行う方法
 ただ、カーネル法の文脈で使われる「カーネル(関数)」とはたいてい「半正定値カーネル」のことを意味するので、前者のような表現が多くなるわけです。

 「半正定値カーネル」の有利な点は、
・低次元な入力空間で内積計算を済ますことができるので、計算量とメモリを削減できる
 ことです。
 実を言うと「内積」を一般化したものが「半正定値カーネル」なのです。数学的な話をするとさらにここから「再生核ヒルベルト空間」に入っていくわけですが、しましま先生のところですら項目ができていないのでそちらに入り込んでいくのはやめておきましょう。
(後日訂正)
すいません。しましま先生のところに項目ありました。
kenichia.hatenablog.com


 で、この「半正定値カーネル」というのもいっぱい種類があります。
 しかも、これら「半正定値カーネル」は組み合わせることも可能です。半正定値カーネルの和、積、指数関数は再び半正定値カーネルになります。
 といっても代表的な半正定値カーネルは以下の2つです。これは『はじめてのパターン認識』に載っていますので詳しくはそちらを参考にしてください。
1. 多項式カーネル
2. 動的基底カーネル(RBFカーネル)=ガウスカーネル(ガウシアンカーネル
(ちなみに『はじめてのパターン認識』では半正定値カーネルは「内積カーネル」という表現になっています。)


はじめてのパターン認識

 他にも、
・フィッシャーカーネル
木構造カーネル
・文字列カーネル
 など、用途に応じて様々なカーネル関数が存在します。
【例外】
 「半正定値カーネル」ではないカーネル関数も存在します。
・シグモイドカーネル
・シンプソンカーネル
 これらのカーネル関数はグラム行列が「半正定値」ではないので「半正定値カーネル」ではないのですが、性能が良いので用いられています。
 このようなカーネル関数は「不定値カーネルと言います。


 まとめましょう。
1. 本来のカーネル関数とは、「2つのデータの間のある種の類似度を表す」関数のこと。
2. ただしカーネル法で使えるカーネル関数は「半正定値カーネル」のみである。そしてカーネル法の文脈では「半正定値カーネル」ではなく「正定値カーネル」と表現されることが多い。
3. 「半正定値カーネル」は計算速度・メモリの観点から有利である。
4. 「半正定値カーネル」の中でも一般的に用いられるのは「多項式カーネル」と「ガウスカーネル(RBFカーネル)」である。
5. しかしながら「半正定値カーネル」はいくらでも組み合わせることが可能であり、用途に応じた様々なカーネル関数が開発されている。
6. 実用上では「半正定値カーネル」ではない「不定値カーネル」も用いられている。
 以上です。
 

mecab-ipadic-neologd のアップデート失敗

 mecab-ipadic-neologd のアップデートに失敗、その後成功しましたのでご報告を。

sudo /mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n
(なんやかやあって)
../libexec/make-mecab-ipadic-neologd.sh: line 102: /usr/bin/mecab-config: そのようなファイルやディレクトリはありません

確かに

which mecab

すると

/usr/local/bin/mecab

 になるので
/usr/bin/mecab-config
ではなくて
/usr/local/bin/mecab-config
になってほしい。

そこで、make-mecab-ipadic-neologd.shの101行目~102行目を見ると、

MECAB_PATH=`which mecab` 
MECAB_DIC_DIR=`${MECAB_PATH}-config --dicdir`

となっています。
ここでも which mecab を使っているわけです。

しかしながら

/usr/bin/mecab-config: そのようなファイルやディレクトリはありません

 ということは、

./libexec/make-mecab-ipadic-neologd.sh

の中で行われている which mecab では

/usr/local/bin/mecab

ではなく、なぜか

/usr/bin/mecab

が返事となって返ってきているということになります。

らちが開かないので、make-mecab-ipadic-neologd.shの101行目を

#MECAB_PATH=`which mecab`
MECAB_PATH=`/usr/local/bin/mecab`

と修正しました。
こうすると正常に終わりましたので、このエラーが出てアップデートがうまくいかない人はこのように MECAB_PATH がどうなっているか調べて直入力してみましょう。

Twitter API用のtoken入手時に求められる携帯番号入力時の認証が失敗する

 Twitter API用のtoken入手時に、携帯電話番号の登録を要求されるようになっていました。
(前はなかったと思うんですが……)
 電話番号を登録し、届いたTwitter認証コードを入力するんですが、

 失敗しました。

 と言われます。
 何度繰り返してもダメだったので不思議に思い検索してみたところ……。
9-bb.com

この通りに携帯電話での認証を行うとうまくいかないケースがあります、それは携帯電話の認証を行う際にTwitterのアカウントの言語が日本語になっていると上手く来ません。携帯電話の認証画面の表示と、SMSの受信まではいけますが、SMSに書かれた内容を入れても認証出来ないバグがありますので。Twitterの言語を英語にしておく必要があります

 このご時世に!
 言語設定を英語(English)に変えないと正しく認証できませんだとぉ!?

 そらこの技術力の無さでは身売りもするわ……。
 ※認証はこの記事のとおりにやって成功しました。

機械学習のための線形代数本

「『機械学習を理解するためには代数を勉強しろ』と言われたが、代数の教科書を読んでもどこが機械学習に役立つのか全く分からない」という話を聞いてその人が読んでいる本を見せてもらったところ、代数の教科書でも群論とか環論の本でした。
「勉強しろと言った人はたぶん『代数』ではなくて『線形代数』を勉強しろと言ったのでは……?」と思ったのですが、「人によって代数学の入り口が違うのかも?」と気づきました。
 現代代数の基礎は「群」、「環」、「体」なので、代数学の入門書は群論から始まります。ただ、たいていの大学では先に線形代数を教えていると思います。ですから「代数を勉強しろ」というのは「当然線形代数から勉強しろ」という意味なのかな……とも思いました。

 ともあれ、機械学習には群論や環論といった抽象代数学を勉強する必要はありません(少なくとも今のところは)。
 必要なのは線形代数の知識です。
 こういった「機械学習向きの線形代数」の勉強におすすめなのが、普通の線形代数の教科書ではなくて

プログラミングのための線形代数
です。
 表紙が「古き良きアメリカンSFコミック風」なので「本当にこの本で大丈夫か?」と心配になりますが、中身は表紙と全く関係なくしっかりした本です。
 この表紙で損してると思うなー。
 線形代数を勉強させられる人は「なぜこんなことを勉強しないといけないのか良く分からない」ということが多いのですが、機械学習をやっている人ならこの本を読めば「『画像を変換する(写像)』『高次元空間の点(データ)を自在に取り扱う』のに線形代数が必須である」ことが分かって勉強しやすいと思います。

 普通の「線形代数」の入門書と違って、
数値計算を行う場合のテクニック
数値計算でのハマりどころ
 が書かれているところもポイントが高い。

黄色本(PRML)は「機械学習」の本ではなく「ベイズ理論」の本である

 タイトルはいささか暴論ですが。


パターン認識と機械学習 上

 私はもともとこの本を「機械学習の教科書」だと思って読み始めました。タイトルが『パターン認識機械学習』ですからね。
 最初に無理矢理読み通した感想は「難しい、良く分からない」というものでした。
 ところが最近、ベイズ理論を勉強したいと思い、再びこの本を手に取ってみたところ……。
 前回よく分からなかったところが、手に取るように分かるようになりました。
 すべてが繋がって見えてくる。これは驚きです。

 もちろんこの本がベイズ理論に基づいた統一的な視点から書かれた本であることは前文にも明記されており、副タイトルも「ベイズ理論による統計的予測」と書かれています。
 しかしながら、この本の主テーマはむしろこの副題だと思うのです。「タイトルに偽りあり」と。
 この副タイトルは実は日本語版にしかないそうで、翻訳した方が心ある方で「このタイトルだけではマズイ」と判断されたのでしょう。よく映画で「日本に持ってくると洋画に本来のタイトルとは違う無茶苦茶なタイトルをつけられてしまう」という問題が発生しますが、この本は逆で副題のほうが日本語版タイトルで良かったと思います。

 「機械学習の本だ」と思って読むと「難しい」と感じ、

 「ベイズ理論の本だ」と思って読むと「目から鱗がポロポロ落ちていく」。

 そんな印象を受けました。

 以前から「機械学習の勉強をするのならば、この本は最初に読むべきではない」と感じていたのですが、その理論的な根拠が得られたと思います。
 この本は「機械学習」を「ベイズ理論」から「見直した」書籍であり、「ベイズ理論」を知らない、または勉強する気のない人間からすると極めて効率が悪い。「機械学習」と「ベイズ理論」の両方を一気に理解できる天才であれば良書なのでしょうが、普通の人はそうでないと思いますので、やはり他の機械学習本から勉強したほうがいいですし、私のようにベイズ理論を勉強したくなってから読んだほうが身につくと思います。

計画行列(デザイン行列)とは何か:PRML編

 黄色本(『パターン認識機械学習』:PRML)を読んでいると、「計画行列」という単語が頻繁に出てきます。
 この計画行列ですが、英語では「design matrix」です。なので別書籍では「デザイン行列」と書かれていることもあります。
 日本語で「デザイン」というと「意匠」のことをイメージしますが、もともとは「設計」の意味です。というわけで日本語の翻訳としても「設計行列」のほうが良かったような気がします。
 この計画行列、もともとは統計学の生まれです。多種類の(重)回帰分析、(共)分散分析などの実験計画をモデル化して表すために作り出されました。たぶん「実験計画」が念頭にあったため「計画行列」という訳語になったものと思われます。

 統計学的計画行列がよくまとまっているのがこちら。
デザイン行列(配置行列)*  (「マルチメディア統計百科事典」より)
https://upo-net.ouj.ac.jp/tokei/xml/k3_04012.xml
 こちらのサイトでは「デザイン行列」「配置行列」と表記されています。

 対して、黄色本では計画行列Φを「基底関数φ_j(x_n)をN行M列に並べたもの」としています。ここでNは入力(及び目標値)の数、Mはモデルのパラメータ数です。

φ_0(x_1), φ_1(x_1),..., φ_M-1(x_1)
φ_0(x_2), φ_1(x_2),..., φ_M-1(x_2)
 …    …     …    …
φ_0(x_N), φ_1(x_N),..., φ_M-1(x_N) 

 で、基底関数とは、「入力変数に関して非線形な関数」です。
 この基底関数を線形結合させた「線形基底関数モデル」は、
・パラメータ(w)に関しては線形 = 解析しやすい
・入力変数(x)に関しては非線形 = 表現力が高い
 という特徴を持つため非常に有用です。

 つまり、黄色本において計画行列とは、具体的には
「(入力変数に関して非線形な関数である)基底関数をモデルのパラメータだけ右の列に並べ、更に入力変数の数だけ下の行に並べた行列」
であり、抽象的には
「当該の線形基底関数モデルを行列で表現したもの」
ということになります。

postgresqlの特定テーブルのみのバックアップ

 なぜかpg_dumpを使ってpostgresqlの特定テーブルのみをバックアップするコマンドが、インターネット上で流布しているコマンドと実際のコマンドで違っていたのでメモ。
 postgresqlのバージョンは8.4.20。

[ネット上でよく見かける(今回動かなかった)コマンド]

pg_dump -d データベース名 -t テーブル名 > 出力ファイル名

[マニュアルに書いてある(今回動いた)コマンド]

pg_dump -t テーブル名 -f 出力ファイル名 データベース名