SVMは、オーバーフィッティングを避けて効率よく識別関数を求めることができる 手法です。
「集合知」の9章で紹介されているSVMをSageを使ってまとめてみます。
いきなりSVMに進む前にクラス分けを簡単な例を使って解いてみます。
下図は、赤(-1)のグループと青(1)のグループの分布です。
|
青点の値に1、赤点の値に-1をセットし、$w_1 x_1 + w_2 x_2 + b$の線形モデルを find_fit関数を使って解いて、$w_1, w2, b$の値を求めます。
find_fitのデータは、$x_1, x_2, 値$の順にセットします。
[[1, 2, -1], [1, 4, -1], [2, 4, -1], [2, 1, 1], [5, 1, 1], [4, 2, 1]] [[1, 2, -1], [1, 4, -1], [2, 4, -1], [2, 1, 1], [5, 1, 1], [4, 2, 1]] |
{b: 0.1962962962945436, w2: -0.4333333333364595, w1: 0.32592592592445524} {b: 0.1962962962945436, w2: -0.4333333333364595, w1: 0.32592592592445524} |
implicit_plot関数を使ってデータ(赤、青)と判別式が0となる線を表示します。 上手く赤と青の点を分離しているのが分かります。
|
求まった判別式がどのような形なのかplot3dを使って表示してみます。 データ(赤、青)の判別式の値も合わせて表示してみます。
一つの平面上として表されています。
Sleeping...
![]() |
SVM(サポートベクターマシン)は、クラスの境界線と分離平面(超平面) の距離(マージン)を最大になるようにクラスを分類します。
先ほどの例では、下図のように境界線(半線)の中間に$y = x$の分離平面が、 あります。(線形分類の境界線とずれていることに注意して下さい)
境界線を求めるとき使った学習データのことを「サポートベクター」と呼びます。
|
sageを使ってSVMを計算したいところですが、sageにはSVMを計算する関数がありません。 そこで、LIBSVMをインストールします。
LIBSVMの ホームページ のDownload LIBSVMから最新のtar.gzファイルをダウンロードします。
ダウンロードしたファイル(libsvm-2.9.tar.gz)を適当な場所(~/local)で解凍します。
$ tar xzvf libsvm-2.9.tar.gz $ cd libsvm-2.9/python
MacOSXの場合、Makefileの一部を変更します。
#LDFLAGS = -shared # Mac OS LDFLAGS = -framework Python -bundle
また、そのままではsageで動かなかったので、svm.pyの以下の2点にfloatのキャストを 追加するように修正してください。
126c126 < svmc.svm_node_array_set(data,j,k,x[k]) --- > svmc.svm_node_array_set(data,j,k,float(x[k])) 138c138 < svmc.double_setitem(y_array,i,y[i]) --- > svmc.double_setitem(y_array,i,float(y[i]))
sage内部のpythonにLIBSVMをインストールするには、sageのpythonで seup.pyを実行します。私は、sageを~/localにインストールしているので
$ ~/local/sage/local/bin/python setup.py installと実行しました。
正しく動くか、集合知の9.9.2の例題で確認します。 無事、同じ結果がでたので、次に進みます。
* optimization finished, #iter = 1 nu = 0.025000 obj = -0.250000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2 * optimization finished, #iter = 1 nu = 0.025000 obj = -0.250000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2 |
1.0 1.0 |
LIBSVMへの入力は、各データどのクラスに属するかを示すclsと データのベクトル値datを引数に取ります。
[-1, -1, -1, 1, 1, 1] [[1, 2], [1, 4], [2, 4], [2, 1], [5, 1], [4, 2]] [-1, -1, -1, 1, 1, 1] [[1, 2], [1, 4], [2, 4], [2, 1], [5, 1], [4, 2]] |
* optimization finished, #iter = 4 nu = 0.033333 obj = -1.000000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2 * optimization finished, #iter = 4 nu = 0.033333 obj = -1.000000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2 |
データが正しく分類されているか赤(1,4)の座標を入力すると、-1.0が返され、 正しい結果が返ってきます。
-1.0 -1.0 |
contour_plotを使って、SVMの予想をコンタマップで表示すると、$y = x$ の線でうまく、分類されているのが、分かります。
|
さらに、各点(赤、青)の予想値と境界線の形状をlist_plot3で表示します。
Sleeping...
![]() |
SVMのカーネルメソッドのすごさを確かめるために点の値がチェスボードのように 格子状に部分布する点を分析することにします。
まずは、チェスボードのマスの値を返すchessBox関数を作成します。 ただしく、値がセットされるか、conour_plotでみてみましょう。
|
0から5の範囲にランダムに点を生成し、chessBox関数で赤(red)と青(blue) に振り分けます。
|
kernel_type=LINEAR(線形を意味する)を使って分類すると、 うまく格子状のデータを分類することができません。
|
........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .........................................................*..............\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ..........*.............................................................\ ........................................................................\ ........................................................................\ ...............................................................*........\ ........................................................................\ ..................*.....................................................\ ...................................*....................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ...................*....................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .......*................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .................................................. Warning: using -h 0 may be faster *.......................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .............................*..........................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .........*..............................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ ........................................................................\ .....................* optimization finished, #iter = 11144286 nu = 0.966000 obj = -966297.432944, rho = 0.978544 nSV = 967, nBSV = 962 Total nSV = 967 Traceback (click to the left of this block for traceback) ... ValueError: zero-size array to ufunc.reduce without identity .................................................................................................................................................................................................................................................................................................................................................................................................................................*................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................*............................................................................................................................................................................................................................................................................*..................................................................................................*........................................................................................*.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................*...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................*.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... Warning: using -h 0 may be faster *....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................*...........................................................................................................................................................................................................................................................................................................................................................................................................................*...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................* optimization finished, #iter = 11144286 nu = 0.966000 obj = -966297.432944, rho = 0.978544 nSV = 967, nBSV = 962 Total nSV = 967 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_19.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("IyDjgqvjg7zjg43jg6vjg6Hjgr3jg4Pjg4njgpJMSU5FQVLjgaDjgajjgYbjgb7jgY/liIbjgZHjgonjgozjgarjgYQKcHJvYiA9IHN2bV9wcm9ibGVtKHJlZENscyArIGJsdWVDbHMsIHJlZCArIGJsdWUpCnBhcmFtID0gc3ZtX3BhcmFtZXRlcihrZXJuZWxfdHlwZSA9IExJTkVBUiwgQz1mbG9hdCgxMDAwKSkKbSA9IHN2bV9tb2RlbChwcm9iLCBwYXJhbSkKY29udG91cl9wbG90KGxhbWJkYSB4LCB5IDogbS5wcmVkaWN0KFt4LCB5XSksICh4LCAwLCA1KSwgKHksIDAsIDUpLCBmaWdzaXplPTUp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpA_PPXV/___code___.py", line 6, in <module> exec compile(u'contour_plot(lambda x, y : m.predict([x, y]), (x, _sage_const_0 , _sage_const_5 ), (y, _sage_const_0 , _sage_const_5 ), figsize=_sage_const_5 ) File "", line 1, in <module> File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/misc/displayhook.py", line 176, in displayhook print_obj(sys.stdout, obj) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/misc/displayhook.py", line 144, in print_obj print >>out_stream, `obj` File "sage_object.pyx", line 154, in sage.structure.sage_object.SageObject.__repr__ (sage/structure/sage_object.c:1496) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/plot/graphics.py", line 803, in _repr_ self.show() File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/misc/decorators.py", line 456, in wrapper return func(*args, **kwds) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/plot/graphics.py", line 1474, in show self.save(**kwds) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/misc/decorators.py", line 456, in wrapper return func(*args, **kwds) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/plot/graphics.py", line 2199, in save figure = self.matplotlib(**options) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/plot/graphics.py", line 1703, in matplotlib g._render_on_subplot(subplot) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/sage/plot/contour_plot.py", line 184, in _render_on_subplot linewidths=linewidths, linestyles=linestyles, label=options['legend_label']) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/matplotlib/axes.py", line 7316, in contour return mcontour.QuadContourSet(self, *args, **kwargs) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/matplotlib/contour.py", line 1106, in __init__ ContourSet.__init__(self, ax, *args, **kwargs) File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/matplotlib/contour.py", line 701, in __init__ self._process_levels() File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/matplotlib/contour.py", line 912, in _process_levels self.vmin = np.amin(self.levels) # alternative would be self.layers File "/usr/local/sage-4.7.1/local/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 1862, in amin return amin(axis, out) ValueError: zero-size array to ufunc.reduce without identity |
次に、kernel_type=RBF(ガウシアンカーネル関数)を使って分類すると、 なんとなく格子状に分類しているように見えます。
ガウシアンカーネル関数は、 $$ K(x, x') = e ^{\left( - \frac{| x - x' |^2}{\sigma^2} \right)} $$
...........................................*............................\ .......................*................................................\ ..* optimization finished, #iter = 143927 nu = 0.217787 obj = -170283.042235, rho = 6.634814 nSV = 244, nBSV = 194 Total nSV = 244 ...........................................*...................................................*..................................................* optimization finished, #iter = 143927 nu = 0.217787 obj = -170283.042235, rho = 6.634814 nSV = 244, nBSV = 194 Total nSV = 244 |
最後に簡単な画像認識をLIBSVMを使って確かめてみます。
5x5のマス目に数字の0から4までを書いた画像5個(本当に少ないです!) をテストデータとして使用します。
|
作成したデータをcontour_plotを使って表示して、確認します。 なんとなくそれらしく見えるでしょう。(笑)
|
いよいよ画像認識の準備が整いました。 えいや〜で、モデルを作成します。
* optimization finished, #iter = 1 nu = 0.246622 obj = -2.466216, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.676333 obj = -6.763327, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.330771 obj = -3.307713, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.202682 obj = -2.026823, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 5 * optimization finished, #iter = 1 nu = 0.246622 obj = -2.466216, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.676333 obj = -6.763327, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.280928 obj = -2.809276, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.330771 obj = -3.307713, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.202682 obj = -2.026823, rho = 0.000000 nSV = 2, nBSV = 0 * optimization finished, #iter = 1 nu = 0.262318 obj = -2.623181, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 5 |
テストに使う画像は、以下の3個です。 判別結果は、ただしく0, 1, 1となっています。(めでたし、めでたし)
|
|
0.0 1.0 1.0 0.0 1.0 1.0 |
念のため、学習に使ったデータが正しく識別されるかもみてみました。
こんなに少ないデータでよく認識できるものだと感心しました。これがSVMのすごさなのでしょうか?
0.0 1.0 2.0 3.0 4.0 0.0 1.0 2.0 3.0 4.0 |
|