2013-03-17

iPython notebookでPRMLのグラフを再現する

先週のPRML復々習レーン#9でPRML下巻の図6.1がいまいち理解できなかったので、Pythonのコードで再現してみた。基底関数と特徴空間への写像の内積で定義されるカーネル関数をxでプロットした図である。

最初Excelのグラフでやってみたが、ありえない事に気づきOctaveに方針変更。それでも、コードと結果を見くらべながら試行錯誤しにくかったので、最終的に@__youki__氏に教えてもらったiPython notebookに落ちついた。

iPython notebookはiPythonのWebクライアント。グラフを試行錯誤しながらガンガンプロットして保存しておける。セットアップは若干面倒だがそのうちfabricのfabファイルとか出てきそう。結果はnbconverterでHTMLに変換できる。コード、結果の共有はもちろん、ブラウザから実行できるので一度サーバーを立ててしまえばどこでも使えて便利。

変換したHTMLを貼りつけたのが以下。

In [4]:
import numpy as np
In [79]:
x = linspace(-1, 1, num=100)
for i in xrange(1,12):
    plot(x, x**i)

ret = title('Basis function')
In [80]:
x = linspace(-1, 1, num=100)
y = np.zeros(100)
x_prime = -0.4
for i in xrange(1,12):
    v = (x ** i)
    y += reduce(lambda x,y :x+y, [v * (x_prime ** i)])
    
plot(x, y)
ret = title(u'Karnel function')
In [26]:
def gaussian(x, mean, sigma):
    return 0.5/np.sqrt(2.0*np.pi)/sigma * np.exp(-((x-mean)/sigma)**2/2)
In [73]:
x = linspace(-1, 1, num=100)
SIGMA = 0.2
for i in xrange(0, 11):
    mean = -1 + (float(i) / 5)
    plot(x, map(lambda x:gaussian(x, mean, SIGMA), x))
    
ret = title('Basis function')
In [77]:
SIGMA = 0.2

x = linspace(-1, 1, num=100)
y = np.zeros(100)
x_prime = 0.0

for i in xrange(0,11):
    mean = -1 + (float(i) / 5)
    v = np.array(map(lambda x:gaussian(x, mean, SIGMA), x))
    y += reduce(lambda x,y :x+y, [v * gaussian(x_prime, mean, SIGMA)])
    
plot(x, y)
ret = title(u'Karnel function')
In [68]:
def logistic_sigmoid(x):
    return 1 / (1 + np.exp(-1 *  x * 10))
In [70]:
x = linspace(-1, 1, num=100)
for i in linspace(-1, 1, num=11):
    plot(x, map(lambda x:logistic_sigmoid(x - i), x))

ret = title('Basis function')
In [82]:
x = linspace(-1, 1, num=100)
x_prime = 0.0;
y = np.zeros(100)

for i in linspace(-1, 1, num=11):
    v = np.array(map(lambda x:logicstic_sigmoid(x - i), x))
    y += reduce(lambda x, y: x + y, [v * logistic_sigmoid(x_prime - i)])

plot(x, y)
ret = title('Karnel function')

このエントリーをはてなブックマークに追加