VC次元¶
VC次元 (VC dimension) は仮説集合の複雑度の指標の一つ。
主に2値判別問題の仮説集合に用いられるが、多値判別問題や回帰問題に拡張することも可能。
名前の由来は理論の創始者であるVapnikとChervonenkisから。
2値判別のための仮説集合を H とする。
仮説 h∈H は、入力空間 X から ∣Y∣=2 であるようなラベル集合 Y への関数とする。
入力の集合 {x1,…,xn}⊂X に対して、Yn の部分集合
{(h(x1),…,h(xn))∈Yn∣h∈H} の要素数を
ΠH(x1,…,xn)=∣{(h(x1),…,h(xn))∈Yn∣h∈H}∣ とおく(英語だとGrowth Functionと呼ばれる様子)。
定義より
ΠH(x1,…,xn)≤2n である。
入力の数nが増えていけばラベル付のパターンが豊富となり、等式ΠH(x1,…,xn)=2nが成立しにくくなると考えられる。その境界となるデータ数nをHのVC次元と呼ぶ。
数式的には、HのVC次元VCdim(H)は
VCdim(H):=max{n∈N∣∣ x1,…,xn∈XmaxΠH(x1,…,xn)=2n} と定義される。また、任意の n∈N に対して x1,…,xn∈X が存在して ΠH(x1,…,xn)=2n が成り立つときは VCdim(H)=∞ と定義する。
VC次元は言葉で説明すると「仮説集合Hのもとで、ラベルのすべての組み合わせを網羅できる(どんなラベル付けにも対応可能な仮説が存在する)データ数の最大値」となる。
例:step function¶
1直線上に並ぶ点で、step functionのようにラベルが変化する(positive raysと呼ばれる?)なら、1つの点で分離できる。
H が h:R→{0,1}なる関数、具体的には h(x)=1(x≥a) をすべて含むとする。
n個のデータ点を2つの領域に分類するとき、n+1個のパターンがある。
Growth functionはΠH(x1,…,xn)=n+1となり、n=0,1のときのみΠH(x1,…,xn)=2nなので、VCdim(H)=1となる。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=[5, 1.5])
x = np.arange(0, 10)
a = 4.5
y = 1 * (x >= a)
ax.arrow(-1, 0, x.max() + 2, 0, head_width=0.1, head_length=0.3, fc='black', ec='black')
for y_ in [0, 1]:
idx = y_ == y
ax.scatter(x[idx], np.zeros_like(x[idx]), label=f"h(x)={y_}")
ax.scatter(a, 0, marker="s", color="red")
ax.text(a, 0.2, "a", color="red", ha="center")
ax.legend()
ax.set(ylim=(-0.5, 1.5), yticks=[], yticklabels=[], xticks=[], xticklabels=[], title="positive rays")
fig.show()
例:intervals¶
1直線上で、ある区間だけy=1、他がy=0となる場合。
Growth functionは
ΠH(x1,…,xn)=(2n+1)+1=21n2+21n+1 となり、n=0,1,2のときのみΠH(x1,…,xn)=2nなので、VCdim(H)=2となる。
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=[5, 1.5])
x = np.arange(0, 10)
a, b = [1.5, 7.5]
y = 1 * (a <= x) * (x < b)
ax.arrow(-1, 0, x.max() + 2, 0, head_width=0.1, head_length=0.3, fc='black', ec='black')
for y_ in [0, 1]:
idx = y_ == y
ax.scatter(x[idx], np.zeros_like(x[idx]), label=f"h(x)={y_}")
ax.scatter(a, 0, marker="s", color="red")
ax.text(a, 0.2, "a", color="red", ha="center")
ax.scatter(b, 0, marker="s", color="red")
ax.text(b, 0.2, "b", color="red", ha="center")
ax.legend()
ax.set(ylim=(-0.5, 1.5), yticks=[], yticklabels=[], xticks=[], xticklabels=[], title="positive intervals")
fig.show()
サウアーの補題¶
HのVC次元をdとおくと、d≤nならΠH(x1,…,xn)は高々d次の多項式オーダーO(nd)となる。
VC次元と予測誤差の関係¶
この定理の証明にはラデマッハ複雑度による一様大数の法則が用いられる。
学習データS={(X1,Y1),…,(Xn,Yn)}が観測されたとき、経験判別誤差R^(h)の最小化で得られる仮説をhSとする。簡単のため、ベイズ規則h0がHに含まれるとする。このとき
R^(hS)≤R^(h0)R(h0)≤R(hS) が常に成り立つ。そして以下が成り立つ
(以下は金森(2015)のp.22の式展開を想像で補ったりしたもの)
R^(hS)≤R^(h0)⟺R^(hS)+追加R(hS)≤R^(h0)+追加R(hS)⟺R(hS)≤R^(h0)+R(hS)−R^(hS)⟺R(hS)≤追加R(h0)−R(h0)+R^(h0)+R(hS)−R^(hS)⟺R(hS)≤R(h0)+∣R^(h0)−R(h0)∣+h∈Hsup∣R(hS)−R^(hS)∣(おそらく、supなら上限のため不等号で大きい方に置いても妥当なため)⟺R(hS)≤R(h0)+2h∈Hsup∣R(hS)−R^(hS)∣(おそらくh0∈Hの仮定のため)⟺R(hS)≤R(h0)+4n2dlogden+2nlog(2/δ)(前述の定理のため) 確率オーダーで表現すると
となり、予測誤差はデータ数とVC次元の比n/dと関連していることがわかる。