最近、スパースモデリングに絡み、正則化のことをちょっとばかりかじっているので、メモ代わりに書いていきます。といっても、毎回のように、まずは前フリ記事から。
まず、二値分類について、高専時代(?もしかしたら大学かも)にコンピュータ関係の授業でコンピュータの重要な機能として、「分類」を上げてた先生を思い出します。分類は、その名のとおりに、いろんなモノや事柄などを分ける行為。人間なら、モノは見た目や重量などで、事柄ならいろんなルールに基いて暗黙的に分けることが可能ですが、1と0しか分からないコンピュータには「分類」は結構厄介な問題。
ならば、そのモノや事柄を圧縮・変換し、コンピュータの分かる数値、1や0に置き換えてしまえばいいのです。
その名の通り、1と0(黒と白)に分けるのが、二値分類です。
しかし、対象となるモノや事柄は、最初から1や0になっているわけではありません。例えば、スポーツという分野をとってみると、
スポーツ一覧
(入力):野球、サッカー、テニス、アメフト、ゴルフ、バレー、マラソン、水泳、柔道、スキー、ボクシング、F1(出力)
球技:野球、サッカー、テニス、アメフト、ゴルフ、バレー
非球技:マラソン、水泳、柔道、スキー、ボクシング、F1
という分類もあれば、
(出力)
集団スポーツ:野球、サッカー、アメフト、バレー
個人スポーツ(チーム戦は除く):テニス、ゴルフ、マラソン、水泳、柔道、スキー、ボクシング、F1
という分類もある。これはそれぞれのスポーツをどの切り口(軸)で見て、切り分けるのかに依っていることになります。
これをイメージで書くと、下記のような入力(上記の場合は各スポーツ)と、出力結果を書くような分類器として定義できます。
さて、話をデータに戻しましょう。上記のスポーツの例を別の方法で記述すると、
野球(球技である、集団スポーツである)
サッカー(球技である、集団スポーツである)
<途中略>…
ゴルフ(球技である、集団スポーツでない)
マラソン(球技でない、集団スポーツでない)
<後略>…
と書いていくことができます。これは高校数学に習ったベクトルの形になっていることが分かります。すなわち分類するということは、
野球(球技である、集団スポーツである)⇒ 分類器【球技か、非球技か?】⇒ 野球(球技である)
という風に、ベクトルとなっているところから、分類器を使って、必要な成分を抜き出すというとこになります。数学が得意な人なら、これは内積を取ればいいことは分かりますよね。よって、上図の分類器は入力データに対し、ある重み
との内積をとって、出力データ
に渡すことになるので、分類器自体は
と書くことができます。すなわち、上記の例では、野球(球技である、集団スポーツである)というのに対し、球技であるということに重みがかかることで、「野球は球技である」という分類が取り出せることになります。このようにベクトルの内積という形で表現できる分類器を、「線形識別器」といいます。
それでは、そろそろプログラムを書いていきましょう。基本、以後はPythonでプログラムは書いていきます。
1 2 3 4 5 6 7 8 9 10 11 |
def w_inner_prod(x): val = 0.0 for x_k in x: val += w[x_k] return val def classify(x): if w_inner_prod(x) > 0.0: return 1 else: return -1 |
ここでw_inner_prod(x)は内積を示しています。xの入力(ベクトル量)に対し、重みの総和になるのが内積となり、ここで分類classify(x)は内積が0以上かどうかで判断しているのです。
ところで、上図の形は昨今話題のディープラーニングとかに登場する、ニューラルネットワークにその形が似ていますよね。実は、この分類器はニューラルネットワークと捉えることもできるのです。もう少し深く注記すると、この重みに対して、学習という概念を取り入れたものになります。これは1958年にフランク・ローゼットによって提唱され、パーセプトロンといいます。
パーセプトロンというと、何だか難しそうですが、実はやっていることは簡単。そのアルゴリズムは
1)まず識別器でうまく分類できるか試す
2)1)で失敗した場合には、重みに出力と入力のスカラ積
を加える
ということをやるだけ。プログラムで書いても
1 2 3 4 5 6 7 |
def learn1(x,y): if classify(x) != y: w += x * y def learn_all(data) for x, y in data: learn1(x,y) |
で済んでしまいます。プログラムを見れば分かりますが、学習といってもやっていることといえば、結果をそのまま再帰的に積をとっているだけなので、正解はより正解に、不正解はより不正解に、と近づけていることをしているだけです。
次回は、SVM(サポートベクターマシン)のことでも書いてみましょうかね。
今回、数式を書く上で、WordPressの「Easy WP LaTeX」というプラグインを使っています。以下、参考まで。
WordPressでTeX数式が使用できるプラグイン「Easy WP LaTeX」 – WordPressの使い方と設定 – Webkaru