投稿

3月, 2018の投稿を表示しています

scikit-learnでパーセプトロンを実装して標準化の効果を実感したお話

イメージ
こんにちは、ぐぐりら(@guglilac)です。
機械学習のお勉強記事シリーズで、ここまで3本ほど書いてきました。

k-means法を解説して実装してみる

混合ガウス分布とEMアルゴリズムを解説して実装してみる

ガンベル最大トリックを解説して実装してみる

クラスタリングが続いていたので、今回は分類問題を扱います。
分類問題の中でも基本的な手法であるパーセプトロンについて、ざっくり解説して実装します。

パーセプトロン自体の解説は軽くにとどめ、機械学習ではよく用いられる標準化というテクニックについても説明し、どの程度標準化が有効なのかを今回の実装で確かめてみます。


パーセプトロンとは? パーセプトロンとは、分類問題を解くのに用いられる機械学習の手法の一つです。
分類問題とは、あるデータがどのグループに属するかを学習し、未知のデータをグループごとに分類することを指します。
前回扱ったクラスタリングもグループごとにまとめるという点では同じですが、分類問題はあらかじめ与えられた学習用のデータにはそれぞれどのグループに属するかという情報が与えられています。
この情報を教師ラベルといい、この情報を元に、与えられたグループへデータを分類していく方法を学習していきます。 このように教師ラベルが付いているデータを元に学習を行う手法を「教師あり学習」と言います。
一方クラスタリングの場合、与えられた学習用のデータには教師ラベルが付いていません。多くの場合、グループの数だけ人間が指定し、いい感じに似たものどうしをまとめてこの数だけグループを作ってねー、みたいな感じです。
クラスタリングのように教師ラベルの付いていないデータを用いて学習を行う手法を「教師なし学習」と言います。
話が逸れましたが、今回用いるパーセプトロンはこのうち教師あり学習の分類問題を解くための手法です。

とても単純な手法であり、フルスクラッチで書いても数十行でかけてしまうほど簡単な方法なのですが、「与えられたデータが線形分離可能でなければアルゴリズムが収束しない」というとんでもない弱点があるために、実際にはあまり用いられません。
(線形分離可能、とは例えばデータが二次元だった場合、一本の直線で二つのグループに正しく分離できる、ということを示しています。なかなか強い条件。)

アルゴリズムはこんな感じ。ざっくり。 入力と重みの…

うなぎの小骨が喉に刺さってまじでしんどかったので耳鼻咽頭科行ってきた

イメージ
こんにちは、ぐぐりら(@guglilac)です。
今日は、うなぎのおはなし。
はじまりはじまり。

1日目 刺さる
全てはここから始まった、、、




とても美味しかったのに。
うまいうまいってうなぎを頬張っていたら、小骨が喉に。

いつもだったら小骨ぐらいどうにかなるしと思って食べ進めるも、違和感が消えず。

まさか刺さってしまったのか、、、と考え始めるとせっかくのうなぎの味もわからなくなってきて。
2重に悲しい。

一応完食はしたものの、気分は晴れず。
食べ終わっても喉がちくちくしていました。
やってしまった。はあ。

この時は、

まあでも、小骨ぐらいが大したことないっしょ、すぐとれるっしょ
とか思ってました。

しかし。

twitterをフォローしてくれている方はわかると思いますが、そっからはとてもしんどかった。。。

まず、家に帰ってうがい。
まあ取れないよね。

で、対処法をぐぐる。

親に勧められた、「ご飯まる飲み作戦」は絶対にやってはいけないとのこと。

飲み込むといい感じに小骨が引っかかって取れてくれそうなイメージなのでしょうが、これは逆効果で、むしろより深く骨が刺さってしまう恐れがあります。

まあ僕が言わなくてもみんな言ってることなんで大丈夫でしょう。
丸呑みはだめだよ。

で、他に対処法ないの?と探すものの、もう残された方法はただ一つ。

病院にいくこと。

ぐぐった感じ、病院にいってとってもらうしかないようです。
鏡とかで小骨がみえそうならピンセットで取る方法もありますが、とても奥に刺さっているようでまったく見えなかったので、問答無用で病院行き。

たかが小骨が喉に刺さったくらいで大げさな、、、と思うかもしれませんが、ピンセットで取れず、1日たっても自然に取れない場合、残された方法は病院に行くことしかありません。

小骨、おそろしい。

そして、運の悪いことに、うなぎを食べたのが土曜日の夜。
うなぎだし土曜にたべるよね。土曜のうなぎ。

なので、翌日は日曜日。病院はほぼしまっています。

さらに。日曜日には9時から20時まで予定が入っていました。
ふええ。

1日ぐらい病院行かなくても大丈夫だろ、とも思いましたが、刺さりっぱなしだと熱が出るとか、食べ物が当たってより奥に骨が刺さって取りづらくなるなどの不安もあり、休日診療所を探して昼休みに予定を抜け出して行ってみることに。

これ…

CodePenでReactのお勉強〜Hello World編〜

イメージ
こんにちは、ぐぐりら(@guglilac)です。
最近関わっている大学の文化祭の企画でアプリを作ることになり、Reactを使うことになりました。



フロントはバグ潰しとかバイト先でちょろっとデザイン当てたりとか趣味程度の自作アプリでUIを整えたことあるレベルで、あんまりがっつり書いたことはないので不安ですが、勉強してみることにしました。

1, 2ヶ月ぐらいやるのでもう何回か記事になるかもです。

なのでReact初心者向けの内容になります。

今回は第1回なので定番のHello Worldをやってみます。

あと、フロントエンドのコードを気軽に試せるCodePenというプレイグラウンドを使います。環境構築がいらないので勉強しやすいと思います。

CodePenCodePenはWebブラウザー上でフロントのコードの動作が確認できるプレイグラウンドサービスです。
有料版もあるみたいですが無料でも全然使えると思うので、いい感じです。
上のリンクでアカウント作って始められます。
このサービスでは、HTMLとCSSとJavaScriptが1セットとなるみたいです。この単位がPenと呼ばれるみたい。
それぞれのファイルはちゃんと読み込まれているので、インクルードし忘れとかはなくてうれし。(よく忘れる)
CreateからNew Penを選べば作れます。 GitHubみたいに無料だとPublicになるみたいですね。 他の点でも割と似ていそうです。
Reactを使ってみる
ReactはJavaScriptのライブラリ。使っておくといいことがあるみたいだけど僕はまだ駆け出しなのでその利点を享受できていないと思うので、わかってる人に聞いてみましょう。
で、CodePenでReactを使うためにはいくつか設定しないといけないとこがあります。
JS processor をBabelにするReactとReact-DOMを読み込む です。
BabelはJSの新しいバージョンであるES2015で書いたコードを、ブラウザーが対応している時代のJSに直してくれるやつみたいです。
2で必要なライブラリーをインポートします。 CodePenではコードにはimport文を書かずにSettingsのところからぽちぽちやると読み込めるようになるみたいです。
1も2も、コード編集画面の右上にあるSettingsから設定…

【振り返り】卒業するので大学生活を振り返る~これから大学生になる方たちへ~

こんにちは、ぐぐりら(@guglilac)です。
早いもので、もうすぐ大学卒業です。
ほんとはやい。はやい。ついこの前入学したというのに。



そんなわけで、はやいはやい言っててもしょうもないので、節目ってことで自分用に振り返りを残しておこうと思います。

基本的には自分のマイルストーン的な感じで書くつもりですが、4月から大学生!という方にも参考にしてもらえたらいいかな、という気持ちもあるのでよかったらどうぞ!

割と特殊な人間なので役に立つかはわかりませんが。笑

ではでは。

入学~1・2年生の頃 某国立大に入学。理系です。ちなみに大学院も同じとこに進みます。

高校生のころは一生懸命勉強していて、視野の狭い学生でした。
勉強とゲームばっかりしていて、部活もろくにやらず、親にも心配されていたと思います。

大学入って、「さしあたって勉強する理由もなくなったし遊ぶかー」と思って新歓期にいろんなサークルに遊びに行ってただ飯を喰らい(新歓期はいろいろ遊び行くといいと思います笑)、結局インカレのバレーボールサークルに入りました。

インカレっていうのは、複数の大学の学生からなるサークルのことです。
僕の周りには女の子が死ぬほどいないので、女子大とのインカレサークルに入るのが出会いとかあっていいんかなーとおもったわけです。

で、はいってみたはいいものの、まーうまくいかない。笑

バレーボールは好きだし向いてると思って入ったので、初心者でしたが割とすぐにできるようになってとても楽しかったのですが、勉強とゲーム漬けの高校生活だったこともあり、あんまり人と仲良くできませんでした。

内向的な性格もあって、特に女の子とは仲良くなれませんでしたねー( ;  ; )

おしゃれとかも高校時代は興味がなく、あんまり身だしなみも気にしていなかったのも大きかったと思います。

入学してすぐ、内向的でダッサいじぶんが嫌いになりました。
で、大学での目標が決まりました。

勉強はとりあえず卒業できればいい。それより自分が好きな自分にがらっと変えることに全力を注ごう。

おかげで勉強は試験前以外一切しなくなりました。笑

変われないのって、結局自分が大事だからだと思っていて、保守的になってるわけですよね。自分の常識で判断して怖いことはやらない。みたいな。

でも、そんなんだといつまでも嫌いな自分のままですよね。だって嫌いな自…

混合ガウス分布とEMアルゴリズムを解説して実装してみる

イメージ
こんにちは、ぐぐりら(@guglilac)です。
前回の記事でk-means法を解説して実装までしてみたので、勢いに乗って今回はEMアルゴリズムについて解説してみようと思います。実装もします。
k-means法を解説して実装してみる
 (なぜクラスタリングばかりやっているのか。)
混合分布には月並みですが、多次元正規分布を使ったものを用いてみます。
混合ガウス分布とは 混合ガウス分布の前に、混合分布について説明します。
混合分布とは、複数の確率分布が混合係数という重みを用いて重み付け平均をとって作られる確率分布のことです。
混合される複数の分布の種類によってバリエーションがありますが、今回扱う混合ガウス分布はガウス分布(すなわち正規分布。通常多次元バージョンを扱います。)
数式で表すとこんな感じ。
\[P(X;\theta)=\sum_{i=1}^{K}\pi_iP(X;\mu_i,\Sigma_i)\]
$pi_i$が$i$番目の確率分布に対応する混合率になります。 ガウス分布を用いる場合は、パラメータ$\theta$は$(\pi,\mu,\Sigma)$の事を指します。
「この混合分布から生成したデータ列を用いて各パラメータを推定したい」というのが今回の気持ちです。
自然な発想としては、得られたデータから対数尤度関数を計算して、これを最大化するようなパラメータをみつけてあげればよいのですが、混合分布の対数尤度関数は偏微分が解析的に計算できません。
そこで、EMアルゴリズムの出番です。 EMアルゴリズムとは 対数尤度関数の偏微分がうまく計算できないので、少しずつパラメータを修正して対数尤度が最大になるパラメータを探索するという手法を用います。

いきなりですが、手順を書いちゃおうと思います。
よくわかんなくてもこれやっとけば大丈夫。なんでこれがうまくいくかは導出のところで書こうと思います。

1.適当な値を各パラメータ$(\pi,\mu,\Sigma)$に設定する。(初期化)
2.更新式に従って各パラメータを更新する。
$j$ステップ目のパラメータから$j+1$ステップ更新式は
\[\pi_i^{j+1}=\frac{1}{n}\sum_{t=1}^n\gamma_i^j(t)\]
\[\mu_i^{j+1}=\frac{\sum_{t=1}^n\gamma_…

k-means法を解説して実装してみる

イメージ
こんにちは、ぐぐりら(@guglilac)です。
春休みに入って卒論の研究室から追い出されたため、 GPUが使えなくなりました( ;  ; )

ので、この機会に他の機会学習の手法をさらっと復習しておこう!と思い、解説とその実装をする記事をこれからいくつか書いていこうかなと思っています。

なるべくフルスクラッチしたいけどどうせ途中で挫折してscikit-learnに逃げる未来が見えるwww

今回は最初なのできつくなさそうなとこから。
教師なし学習のクラスタリング手法としてポピュラーなk-means法を解説して実装してみます。

こんな感じのきらきらーな結果ができた!
かきごおりみたい。



k-means法とは k平均法とも言います。 教師なし学習の一種であるクラスタリングを行う手法であり、アルゴリズムも単純なことから実装もしやすく、最初にはちょうど良さそうです。がんばろう。
k-means法はこんな感じのアルゴリズムです。 これによってN個のデータをk個のグループにクラスタリングします。 適当にk個のグループに対応する代表点を決める(initialize)N個のデータを代表点が一番近いグループにそれぞれ割り当てる割り当てたデータをグループごとに平均することで代表点を計算し直す 以降、更新量が小さくなるまで2,3のステップを繰り返す k平均法の平均はステップ3の処理に対応している感じですね。 直感的にもそれっぽいアルゴリズムで理解しやすいと思います。
最初にこのアルゴリズムを知った時、「めちゃ適当につくった感がすごいなww」をと思ったんですが、導出する過程もちゃんとあるので、次は導出過程を解説します。
アルゴリズムの導出 損失関数を定義して、エラー度合いを計算できるようにします。
この損失関数が小さくなるように代表点を修正していくアルゴリズムになっています。

まず損失関数$J$は次のように定義されます。

\[J=\sum_{n=1}^{N}\sum_{k=1}^{K}r_{nk}(x_n-\mu_k)^2\]

xがデータで、N個あります。
kはグループに対応するインデックスで、全部でK個あります。
$\mu_k$はk番目のグループの代表点を表すベクトルです。
$r_{nk}$は、n個目のデータがk番目のグループに属していたら1、そうでなければ0をとる変数とします。

日…