ソフトマージンサポートベクターマシン CVXPY

ソフトマージンサポートベクターマシン

ソフトマージンサポートベクターマシン(SVM)は、データが完全に分離できない場合に使用されます。

以下に、2次元のデータセットに対するソフトマージンSVMの例を示します。

この例では、CVXPYを使用して最適化問題を解き、matplotlibを使用して結果をグラフ化します。


まず、必要なライブラリをインポートします。

1
2
3
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

次に、ランダムな2次元データセットを生成します。

1
2
3
4
5
6
np.random.seed(1)
n = 50
d = 2
X = np.random.randn(n, d)
delta = np.random.uniform(-0.5, 0.5, size=(n,1))
Y = 2*(X[:,0:1] + delta > X[:,1:2]) - 1

次に、ソフトマージンSVMの最適化問題を定義します。

1
2
3
4
5
6
7
8
9
w = cp.Variable((d, 1))
b = cp.Variable()
xi = cp.Variable((n, 1))
C = 1.0

objective = cp.Minimize(cp.norm(w, 2) + C*cp.sum(xi))
constraints = [cp.multiply(Y, X @ w + b) >= 1 - xi, xi >= 0]
prob = cp.Problem(objective, constraints)
prob.solve()

最後に、結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
plt.figure(figsize=(8,8))
plt.scatter(X[:,0], X[:,1], c=Y.flatten())
slope = -w.value[0] / w.value[1]
intercept = -b.value / w.value[1]
x_vals = np.linspace(-2, 2, 100)
plt.plot(x_vals, slope * x_vals + intercept, 'k-')
plt.fill_between(x_vals, slope * x_vals + intercept - 1 / np.linalg.norm(w.value), slope * x_vals + intercept + 1 / np.linalg.norm(w.value), color='k', alpha=0.1)
plt.xlim([-2, 2])
plt.ylim([-2, 2])
plt.show()

このコードは、2次元空間にランダムに生成されたデータポイントをプロットし、ソフトマージンSVMによって計算された分離超平面(黒線)とマージン(灰色の領域)を表示します。

[実行結果]

解説

この例では、ソフトマージンサポートベクターマシン(SVM)を使用して、2次元空間にランダムに生成されたデータポイントを分類しています。


SVMは、データポイントを最も効果的に分離する超平面を見つけるための機械学習アルゴリズムです。

この超平面は、異なるクラスのデータポイント間のマージン(つまり、最も近いデータポイントまでの距離)を最大化します。


しかし、現実のデータはしばしば完全には分離できないため、ソフトマージンSVMは一部のデータポイントがマージンを侵害することを許容します。

これは、スラック変数ξ(xi)を導入することで実現され、これにより一部のデータポイントがマージンの「間違った側」に存在することを許容します。


この例の結果をグラフ化すると、黒線がSVMによって計算された分離超平面を表し、灰色の領域がマージンを示します。

データポイントは色でクラスが示され、一部のデータポイントがマージンを侵害していることがわかります。

これはソフトマージンSVMが許容する「間違い」を示しています。


最適化問題の目的関数は、マージンを最大化(つまり、wのノルムを最小化)し、同時にマージン侵害を最小化(つまり、スラック変数ξの合計を最小化)することです。

ここで、Cはこれら二つの目標の間のトレードオフを制御するパラメータです。

Cが大きいほど、マージン侵害をより厳しく罰することになります。