2011-11-13
Pythonで線形SVM。
こちらの記事を参考にしました。
参考というか、もはや写経です。
非常に勉強になりました。
#coding:shift-jis
import numpy as np
from scipy.linalg import norm
import cvxopt
import cvxopt.solvers
from pylab import *
# 全データの総数。
N = 10
# クラス1のデータ。
cls1 = [(1,6),
(2,10),
(3,8),
(4,11),
(5,9)]
# クラス2のデータ。
cls2 = [(1,3),
(2,2),
(3,4),
(4,1),
(5,3)]
# クラス1には1、クラス2には-1を割り振ってarrayにする。
t = []
for i in range(N/2):
t += [1.0]
for i in range(N/2):
t += [-1.0]
t = array(t)
"""データ行列Xをvsstackで作成。以下のようにスタック。X[1,0]で2とか。X[行,列]。
[[ 1 6]
[ 2 10]
・・・
[ 4 1]
[ 5 3]]
"""
X = vstack((cls1, cls2))
# 線形カーネル。x*yの総和。
def kernel(x, y):
return np.dot(x, y)
#10*10の0行列を用意する。
K = np.zeros((N, N))
# Kを作る。
for i in range(N):
for j in range(N):
K[i,j] += t[i]*t[j]*kernel(X[i],X[j])
#Kはこのmatrixにしないとらめ。
Q = cvxopt.matrix(K)
# マイナスにするのでこのpが必要。-1がN個の列ベクトル。
p = cvxopt.matrix(-np.ones(N))
# 不等式制約。
G = cvxopt.matrix(np.diag([-1.0]*N)) # 対角成分が-1のNxN行列
h = cvxopt.matrix(np.zeros(N)) # 0がN個の列ベクトル
# 等式制約。w*xの総和が0。
A = cvxopt.matrix(t, (1,N)) # N個の教師信号が要素の行ベクトル(1xN)
b = cvxopt.matrix(0.0) # 定数0.0
sol = cvxopt.solvers.qp(Q, p, G, h, A, b) # 二次計画法でラグランジュ乗数aを求める
a = array(sol['x']).reshape(N) # 'x'がaに対応する。ラグランジュ乗数aのリスト。
# サポートベクトルのインデックスのリストを。
S = []
for i in range(len(a)):
if a[i] < 0.00001: # ほぼ0ならサポートベクトルじゃない。
continue
else:
S += [i]
# wを計算。
w = np.zeros(2) #行列を用意。
for n in S:
w += a[n]*t[n]*X[n]
# bを計算。
sum = 0
for n in S: # サポートベクトルの数だけforループ。
temp = 0
for m in S: # サポートベクトルの数だけforループ。
temp += a[m]*t[m]*kernel(X[n],X[m])
sum += (t[n]-temp)
b = sum/len(S)
# データをプロット。
for p in (cls1+cls2):
plot(p[0],p[1],'bo')
# サポートベクトルを描画
for n in S:
plot(X[n,0], X[n,1], 'ro')
# 識別関数を描画。
def f(x1, w, b):
return - (w[0] / w[1]) * x1 - (b / w[1])
# 識別境界を描画
x1 = np.linspace(-6, 6, 1000)
x2 = [f(x, w, b) for x in x1]
plot(x1, x2, 'g-')
xlim(0, 6)
ylim(0, 12)
show()
SVMについてはある程度理解できました。
頭のとんでもなく悪い自分としては結構嬉しい。
数式弄りながら実装するの楽しかったなあ。
まあ、最初はなかなか理解できず死にたくなりましたが笑。
それよりも、Pythonでの行列計算に慣れないとらめだと痛感。
cvxoptにつてもいろいろ知っておかないとだめぽ。
線形代数は院試で割と勉強したけれどちょいちょい忘れかけてるし、復習しないと。
次は非線形SVMだー!
これはさらにおもしろそうだー!!!
トラックバック - http://d.hatena.ne.jp/Mr_Tsubaki/20111113/1321184553
リンク元
- 59 http://www30.atpages.jp/keatontsubaki/
- 39 http://tsubaki986.exblog.jp/
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=13&cts=1331038499437&ved=0CDYQFjACOAo&url=http://d.hatena.ne.jp/Mr_Tsubaki/20111113/1321184553&ei=NAlWT4eqJOf6mAWp8bz2CQ&usg=AFQjCNGUPrllGRaAQASYcSCaxArZ-jqhQg&sig2=2ZgpC1ckNhYUsrf
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=k近傍法 多数決&source=web&cd=2&ved=0CCcQFjAB&url=http://d.hatena.ne.jp/Mr_Tsubaki/20111108/1320751137&ei=plnLToHUDIvUmAXr28y-DQ&usg=AFQjCNGxm9CNNlcwHn7E
- 22 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331116539128&ved=0CFYQFjAD&url=http://d.hatena.ne.jp/Mr_Tsubaki/20111003/1317595424&ei=7DlXT9q5N-XumAXXkMm6Dw&usg=AFQjCNHIGWKeAcBr166Ju9LEfW62K2tJXQ
- 21 http://d.hatena.ne.jp/aidiary/20100501/1272712699
- 21 http://t.co/f72yUDET
- 21 http://t.co/yhE67JyD
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=アニーリング python&source=web&cd=1&ved=0CB8QFjAA&url=http://d.hatena.ne.jp/Mr_Tsubaki/20111112/1321072823&ei=kynBTo2ZGs7AmQX3vNHvAw&usg=AFQjCNH0ydL9oPWUEL6tJ
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCsQFjAB&url=http://d.hatena.ne.jp/Mr_Tsubaki/20111111/1320981252&ei=X90lT-DbH6zBiQefx42dBA&usg=AFQjCNFVp7H0IeRoSBJFOzkpY-of7N491A&sig2=xuXyiCA29FtBtqDvHPQHLw
