2011-11-01から1ヶ月間の記事一覧

matplotlibで線形分類器の分離平面を描くには

これをどうやって描いたかという話まず矢印が変な形になるのを避けるために散布図の縦と横の縮尺を固定し(1)、重みベクトルで矢印を描き(2)、大きな灰色の長方形をほぼ透明にして重みベクトルの値を元に作ったアフィン変換で回転して描画している(3)data1, d…

ロジスティック回帰を実装した

あんまり面白いもんでもなかった。

matplotlibでtransformを指定したpatchをadd_patchすると親axesの座標系を無視する

matplotlibでpatchにtransformをつけると消えてしまうように見える現象が起きた。 まず、散布図の上に普通に長方形のpatchを乗せてみる。 clf() scatter(random(100), random(100)) ax = gca() rect = Rectangle((0, 0), 1, 1, alpha=0.3) ax.add_patch(rect…

ナイーブベイズを実装した

上から、真の出力確率、潜在変数と出力のサンプル(潜在変数1個あたり5個の出力を出している)、訓練データ(潜在変数と出力の対)、そのデータで学習した後の出力確率、それを元に別の出力系列から潜在変数を推測したもの。3本の一番上が真の潜在変数で、真ん中…

隠れマルコフモデルを実装した

一番上のグレーの正方形が真の遷移確率、3x8のカラーのが真の出力確率で、その下のカラーのバーが真の潜在変数の系列と出力変数の系列。真ん中の段がそれを3回EMで学習した後の遷移確率と出力確率、カラーバーは上から、真の潜在変数、出力変数、zの確率によ…

混合ガウス分布モデルのクラスタをk平均法とEMアルゴリズムと変分ベイズでそれぞれ推定

「クラスタは球状だ」と想定しているk平均法が苦労するように、細長くて交差したクラスタのデータを使った。また変分ベイズの「クラスタの個数を自動調整する」というメリットを確認するために、クラスタの個数は2, 4, 8個で行った。EMアルゴリズムと変分ベ…

matplotlibのPatchCollectionは子パッチの色を上書きする

「matplotlib.patches.Circleのオプション引数fillが機能していない疑惑」の解決編PatchCollectionはデフォルトでCircleなどのパッチで指定した色を上書きしてしまう。 Definition:PatchCollection(self, patches, match_original=False, **kwargs) (snip) *…

Numpyではゼロで割っても例外が飛ばない

飛ぶと思い込んでいたので、ここで入ったnanのせいでしばらく進んでから逆行列を求める計算LinAlgError: Singular matrixで死ぬのに悩まされた。 >>> array([0]) / 0.0 array([ nan]) >>> array([1]) / 0.0 array([ inf]) NaNやInfが出てきた時点で例外を飛…

Matplotlibでグラフのサイズを変更

最近色々とNumpy+Matplotlibでグラフを書いているが、デフォルトの設定で出力すると800x600ピクセルで出力されるのではてなダイアリーに貼ったときに縮小されてしまう。そこでサイズの変更の仕方を調べてみた。まずmatplotlib.pyplot.figureにはfigsizeって…

情報処理学会の特集「未踏ユースから育ったタレントたち」に寄稿しました

情報処理学会の会誌「情報処理」で「未踏ユースから育ったタレントたち」という特集が行われています。竹内郁雄先生から執筆を頼まれて断れるはずがなく(笑) 書くこと自体より、書いた後で要請されて第1段落の内容を書きたしたら1.5ページになっていしまい1…

チケットレコメンデーション

Python温泉にて「チケットがたくさん山になっているとヤル気がそがれたりどれからやったらいいか悩むのに時間を使ったりしてしまうので、オススメのチケットを選んでくれるシステムがあったらいいんじゃないの?」って話題になったのでコンセプトプルーフを…

NumPyで特定の条件を満たす行、列を除去する方法

NumPyではスライシングで特定の条件を満たす要素だけ選択できる。逆の条件で使えば特定の要素だけ除去するのも簡単。 >>> array(range(5)) array([0, 1, 2, 3, 4]) >>> v = _ >>> v[v != 2] array([0, 1, 3, 4]) これは「v != 2」の部分で演算子がオーバーロ…

Numpyのndarrayは空でなくても偽になる

Pythonのリストの場合、ifの条件式に入れてboolに変換された場合は日本語で言うと「空かどうか」になる。 >>> if []: print "not empty" >>> if [0]: print "not empty" not empty >>> print bool([]), bool([0]) False TrueでもNumpyのndarrayはそうではな…

変分ベイズによる混合ガウス分布のパラメータ推定を実装した

最初6つ用意しておいたクラスタが、学習と共に消えて行って最終的に2個になるのが観察できる。初期パラメータによって収束するパターンはまちまちなので、次は初期パラメータを変えて何度も学習し、一番良い結果に収束したものの動画をつくろう。ちゃんとX字…

カルマン利得行列の意味

昨日の社内機械学習勉強会のハイライト、PRML P.357のカルマン利得行列(eq. 13.92) の意味について忘れないうちにまとめておく。Σが0に近い時、つまり出力確率の分散が小さい場合を考えてみよう。出力確率の分散が小さいってのは「センサーが優秀で、ほとん…

カッティングシートの水貼りに挑戦した日記

結婚式のウェルカムボード、二人の写真で作ってもその後困るだけじゃないか?などと考えていたら妻が「カッティングシートであなたの作品の表面にWelcomeって入れれば、あとで剥がして元に戻せるんじゃない?」と言うのでやってみた。カッティングシートはハ…

指輪のカパッと開く箱はどういう仕組みか?

あの「カパッ」と開く箱の仕組みについて、気になったので分解して見ることにしました。もちろん事前に妻の承諾は得ていますよ!意外とシンプル。 蝶番と板バネが入っているだけ 板バネが両端を近づける方向に力をかける。蝶番のバネを引っ掛ける部分が少し…

matplotlib.patches.Circleのオプション引数fillが機能していない疑惑

下のコードでfill=Falseをしているにもかかわらず「青く塗られた円」が描かれる。 from matplotlib.collections import PatchCollection from pylab import * def draw(): clf() circles = [Circle(random(2), radius=random(), fill=False)] gca().add_coll…

ipythonのプロンプトが化けてしまった→解決

なぜか一度ipythonを終了してまた起動したらプロンプトがおかしくなってしまった。resetしてもTerminal.appを再起動しても治らない。 34In[1;3[0;34][0何をいじったせいなのか…しばらく悩んだけどもipythonの起動時にreadlineに関する警告が出ていたのでsudo…

変分ベイズの行間を読んでグラフィカルモデルに情報を書きたしてみた

変分ベイズを勉強中。数式も、グラフィカルモデルも、最小限のことしか書いていないから行間を読むのが大変だ。ようやく少しわかったので独自記法でグラフィカルモデルに書きたしてみた。 まず混合正規分布のグラフィカルモデルについて、グラフィカルモデル…

EMアルゴリズム答え合わせ

自分の実装した「Numpyで混合ガウス分布のEMアルゴリズムを実装した」のコードを中谷さんの「EM アルゴリズム実装(勉強用) - Mi manca qualche giovedi`?」と照らしあわせて答え合わせしてみる。まず、EMアルゴリズムってなんなのかって話を簡潔に。観測でき…

numpy+matplotlibで散布図の上にバツ印をつける

「バツ印をつける」と言った場合、多くの場合言語化されていない暗黙の要求仕様がある。「バツ印はグラフの軸に影響されて横長になったりしないでほしい」とか。前回 「NumPy+Matplotlibで散布図の上に平均と分散を表示する」 ではCircleをPatchCollectionに…

numpyでk-means法を実装した

NumPyすごいな。学習部分は実質2行だ。 # E-step nearest_cluster = array([argmin([norm(x - mu) for mu in mus]) for x in data]) # M-step mus = [average(data[nearest_cluster == k], axis=0) for k in range(K)] 「パターン認識と機械学習」(PRML)読書…

NumPy+Matplotlibで散布図の頂点に色をつける

散布図のマーカーに"+"を指定して「あれー、色を指定しても反映されないなー」と悩んでいたが、指定した色はマーカーの塗りに使われるのであった。"+"だと塗りがないから色が変わらないというオチ。edgecolorを指定すればいいんだろうけどマーカーを"o"に変…

numpyで対角行列を作る

与えられた成分が対角成分に入っているような対角行列を作りたい場合、diagを使えばよい。 In [837]: diag([1, 2, 3]) Out[837]: array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])

numpyのndarrayで内積と外積を計算

内積(v^t v)や行列の積はndarrayのdotメソッドでできるが、外積(v v^t)はどうやってやるんだろう…それらしきメソッドがないなぁ…と思ったらouterって関数があった。めでたしめでたし。 In [833]: array([1, 2, 3]) Out[833]: array([1, 2, 3]) In [834]: v =…

Jubatusワークショップに行って来ました

昨日行われたJubatus Workshopに参加してきました。ref. 第一回 Jubatus Workshop #jubatus - Togetter JubatusOfficial Presentations以下は僕の解釈も含めたまとめ ユバタスの必要性 データはこれからも増加していく。今多いってことより、今後どんどん増…

ImageMagickで動画GIFを作成する方法

$ convert -delay 100 -loop 0 [1-6].png anime.gif楽チン。 $ convert -delay 100 -loop 0 fig*.png anime.gif10枚を超えてきたら"%02d"とかでfig00.png ... fig99.pngにしてアスタリスク(*)で取ったほうがよさげ。

Numpyで混合ガウス分布のEMアルゴリズムを実装した

楕円は3標準偏差、初期値からEMステップを1回、2回、3回、7回、15回(平均のベクトルの変化量が0.0001未満という基準で収束と判定)の6枚でアニメーションGIFにしてみた。 こっちはEMステップを0〜15回実行。k平均法ではこれはできまい。しかし初期値によって…

numpyのinvertは逆行列ではない

おっと。invertで逆行列をつくろうとしたら謎の行列が返ってきた。 In [1]: invert(array([[4, 0], [0, 1]])) Out[1]: array([[-5, -1], [-1, -2]]) invertは「Compute bit-wise inversion, or bit-wise NOT, element-wise.」だそうな。invを使うのが正解。(…