数学とPythonのメモ帳

僕のメモ帳です。同じ疑問を感じた方の参考になれば良いです。

サポートベクターマシンのパーセプトロンアルゴリズムをPythonで

2クラス分類を解く一番簡単なアルゴリズムです。

#適当な10点のx1,x2成分
x1 = np.array([0,2,4,6,8,10,12,14,16,18])
x2 = np.array([1,2,1,4,3,9,7,6,7,11])

#それぞれのラベル
y = np.array([-1,-1,-1,-1,-1,1,1,1,1,1])

#点を全てプロット
plt.scatter(px, py)

#重みは0に近い値で初期化
w = np.array([0.001,0.001,0.001])

#失敗の数を表す
k = 0

#サンプルの中での、ノルムの最大値
R = np.linalg.norm(np.array([x1[9], x2[9]]))

#学習率 適当に小さく
eta = 0.001

#繰り返し継続判定のフラグ
miss = True

#パーセプトロンの学習
while(miss):
    miss = False
    for i in range(10):
        if(y[i] * (w[0]*x1[i] + w[1]*x2[i] + w[2]) <= 0): #分類ミス
            miss = True
            w[0] = w[0] + eta * y[i] * x1[i]
            w[1] = w[1] + eta * y[i] * x2[i]
            w[2] = w[2] + eta * y[i] * R * R
            k += 1

#-3から20まで0.1刻みでnumpy配列で用意
x = np.arange(-3, 20, 0.1)

#学習して得た直線の式
y = -(w[0] / w[1])*x - (w[2] / w[1])

plt.plot(x, y)

plt.show()

f:id:keitainoue157:20181214010343p:plain

いい感じに分類してくれていますね!