第5章
k最近傍法(kNN法)
2013/9/3
@「はじめてのパターン認識」読書会
twitterID:wwacky
8月1日から新しい職場で働いてます
最近コードを書いてない・・・
1週間後の博士論文の審査で使う発表資料がほぼ白紙で
死にそう
 やばすぎて艦これ断ちするレベル
自己紹介
説明のために一部順序を
少し入れ替えています
あと、図表ははじめてのパターン認識からの引用です
おことわり
最近傍法って何だ
最近傍法って何?
簡単に言うと
「近いデータに合わせる」
判別対象のデータが、どの
鋳型(いわゆる学習データ)
に一番近いかで判別する
コインのサイズ
コインの重量
一番近い鋳型が真、
だからこれも真
真
偽
どうやって近さを求めるの?
一般的には
「ユークリッド距離」を使う
あるデータxと、クラスiのj番目の
データxj
(i)のユークリッド距離
d(x,xj
(i)) = |x-xj
(i)|
 原理的には他の距離でもいい
けど、ユークリッド距離を使
うのが一般的らしい
コインのサイズ
コインの重量
真
偽
この距離
最近傍法の識別規則は?
   


 

other
txxd
reject
xxd
i
j
i
j
i
の時 
識別クラス
)()(
,min,minarg
コインのサイズ
コインの重量
真
偽
距離が一番小さいデータ
が属するクラス
一番近い鋳型との
距離がtより大きい
時はreject !
識別規則はボロノイ図で表せる(要は可視化?)
最近傍法での判別
学習データ1
学習データ2
学習データ3
識別対象データA
識別規則はボロノイ図で表せる(要は可視化?)
最近傍法での判別
データ1のボロノイ
領域(支配領域)
データ3のボロノイ
領域(支配領域)
データ2のボロノイ
領域(支配領域)
データ1のボロノイ領域内
↓
データ1のクラスと識別
最近傍法での判別
ボロノイ境界
ボロノイ境界
各学習データから等距離の点の集合
最近傍法での判別
ボロノイ境界
   3,...,1  NxxS N   
ボロノイ境界
学習データxiとxjのボロノイ境界B(xi, xj)
B(xi, xj) = {x|d(xi, x) = d(xj, x)}
⇒xiとxiから等距離のxの集合
1と3の境界だと
この辺も境界…?
最近傍法での判別
データ1と
データ3の
超平面
ボロノイ境界(を作る超平面)
ベクトルを使って表現するとこうなる
上式を満たすxが表す超平面がボロノイ領域を作る
     jiji
T
xxnxxxnxx       ,2/,0
n
x
最近傍法での判別
     jiji
T
xxnxxxnxx       ,2/,0
半空間(超平面のあっち側とこっち側)
超平面は、
xiを含む半空間D(xi, xj) = {x|d(xi, x) < d(xj, x)}と
xjを含む半空間D(xj, xi)に
二分割する
半空間
D(1, 3)
半空間
D(3, 1)
超平面
最近傍法での判別
3次元で表すと超平面はこんな感じみたい
最近傍法での判別
超平面だとボロノイ
境界にするには
ここいらなくね?
データ1とデータ2から
作ったデータ1の半空間
データ1とデータ3から
作ったデータ1の半空間
データ1とデータ2から
作ったデータ1の半空間
データ1とデータ3から
作ったデータ1の半空間
重複箇所がボロノイ領域
    ijSx
jii
j
xxDSxVR


,
,,
ただし、上式は
開集合だから境
界は含まないら
しい。
境界を含める閉
包の場合は以下
で表現
 SxVR i ,
ボロノイ図またの名をボロノイモザイク
さっきの閉包を全部くっつけたのがボロノイ図
   jiSxx
ji
ji
SxVRSxVRSV


,,
),(),(  
これは境界を表す
当然だけど、学習データを増やすと識別性能は上昇する
 当然、ケースバイケースになるだろうけど・・・
データの数と識別性能
kNN法って何だ?
kNN法(k最近傍法)って何?
大ざっぱに言うと、
近傍k個のデータから識別する
2クラス識別の例で考える
右図は、ユークリッド距離で
マッピングしたものと思ってくれ
クラス1鋳型
クラス2鋳型
kNN法(k最近傍法)って何?
大ざっぱに言うと、
近傍k個のデータから識別する
2クラス識別の例で考える
クラス1鋳型
クラス2鋳型
識別対象データ
kNN法(k最近傍法)って何?
大ざっぱに言うと、
近傍k個のデータから識別する
k=3とすると…
近傍3個の鋳型のクラスを確認
クラス1鋳型⇒2個
クラス2鋳型⇒1個
クラス1と識別 クラス1鋳型
クラス2鋳型
k=3
kNN法(k最近傍法)って何?
大ざっぱに言うと、
近傍k個のデータから識別する
k=4とすると…
近傍4個の鋳型のクラスを確認
クラス1鋳型⇒2個
クラス2鋳型⇒2個
識別をリジェクト クラス1鋳型
クラス2鋳型
k=4
ランダムでクラス1、クラス2を決めてもいいらしい
kNN法(k最近傍法)って何?
大ざっぱに言うと、
近傍k個のデータから識別する
k=8とすると…
近傍8個の鋳型のクラスを確認
クラス1鋳型⇒3個
クラス2鋳型⇒5個
クラス2と識別 クラス1鋳型
クラス2鋳型
k=8
kNN法の識別規則
に属する鋳型の数個の鋳型の内、クラス近傍
識別クラス
ikk
kkkk
kkk
reject
j
i
Kji
Kj
:
},...,max{},...,{
},...,max{}{
where
where
1
1






kNN法の識別規則
近傍k個の鋳型の内、数が最も多いクラスjと識別する
に属する鋳型の数個の鋳型の内、クラス近傍
識別クラス
ikk
kkkk
kkk
reject
j
i
Kji
Kj
:
},...,max{},...,{
},...,max{}{
where
where
1
1






kNN法の識別規則
近傍k個の鋳型の内、数が最も多いクラスが複数存在する
場合はrejectする
に属する鋳型の数個の鋳型の内、クラス近傍
識別クラス
ikk
kkkk
kkk
reject
j
i
Kji
Kj
:
},...,max{},...,{
},...,max{}{
where
where
1
1






何でk個の鋳型を使うの?
最近傍法だと、他クラスの中に別クラスの鋳型が紛れてい
ると、孤立した識別境界ができる
⇒過学習するから汎化性能が低いってこと?
最近傍法(ボロノイ境界)
何でk個の鋳型を使うの?
kNN法だと複数の鋳型の情報を使用するので、誤りを許容
した識別境界になる(孤立する識別境界が減る)
最近傍法(ボロノイ境界) kNN法(識別境界。k=11)
最適なkはいくつ?
汎化誤差が最少となるkを求めればいい
CrossValidationなどを使ってk毎の汎化誤差を求める
 汎化誤差の計測は2.2節を参照
 本の例だとホールドアウト法と、一つ抜き法を使っている
 kが増えた時のホールドアウト法の誤り率が高いのは、次元の呪いの
せいらしい
こういう時にkを大きく
し過ぎると、▲のクラス
と識別してしまうから?
kNN法の弱点
処理が重い
 鋳型(学習データ)を全探索するから当たり前
 手法の改善
 誤り削除型kNN
 圧縮型kNN
 分枝限定法
 近似最近傍探索
次元の呪いの影響を受ける
 ベイズ誤り率から分かるみたい
kNN法の改善手法
誤り削除型kNN法(Edited kNN)
kNNで識別境界を作成した時に、不正解の識別領域に含
まれる鋳型を削除する
 削除すると識別境界が変わるので、再帰的に削除を行ったりする
こういうのを消す
圧縮型kNN(Condensed kNN)
識別に関係ない鋳型を削除する
 削除前と後で、誤り率が同じになるように選ぶ
こういうのを消す
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
分枝法
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
分枝法
クラスタリングで学習データ
を組織化する。
階層クラスタリングを使うみた
いだが、非階層クラスタリング
でも効率化できるのかは不明
S1
S4
S2
S3
S6
S7S5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
分枝法
クラスタリングで学習データ
を組織化する。
階層クラスタリングを使うみた
いだが、非階層クラスタリング
でも効率化できるのかは不明
S1
S4
S5
S2
S3
S6
S7
クラスタの平均ベクトルmiと、
平均ベクトルから最遠のデー
タとの距離diを算出
m4
m1
d5
m5
m3
d3
d4
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
こいつの
近傍を探索
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
一番上の階層のクラスタの平
均ベクトルmi との距離を算出
し、最も近いクラスタを探す
対象データとm1、m2、m3との
距離を算出すると、m1が最も
近い(S1が最も近い)
S1
S2
S3
m1
m3
m2
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S1の中のクラスタの平均ベク
トルmi との距離を算出し、最
も近いクラスタを探す
対象データとm4、m5との距離
を算出すると、 m4が最も近
い(S4が最も近い)
S1
S2
S3
S4
m4
S5
m5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4の中の学習データから最も
近いデータを探す。
S4の中のだとx38が一番近い。S1
S2
S3
S4
S4の中で最も近い。
x38のとする。
S5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4の中の学習データから最も
近いデータを探す。
S4の中のだとx38が一番近い。
S4以外のクラスタのデータが
もっと近かったりしないの
か?
S1
S2
S3
S4
こっちのデータは?
x38
S5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
↓
S5を探索する必要はない
探索するデータが減らせる!
S1
S2
S3
S4
x38
S5d5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
S1
S2
S3
S4
x38
S5d5
一旦位置関係は忘れて、S5のデータが取り得
る範囲を考える。
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
S1
S2
S3
S4
x38
S5d5
一旦位置関係は忘れて、S5のデータが取り得
る範囲を考える。
d(x,m5) > d(x, x38) + d5なら、S5とx38の間に隙
間ができる ⇒ S5のデータはx38のより遠い
m5
d5
x38 x
d(x, x38)
d(x, m5)
S5のデータが
取り得る範囲
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
S1
S2
S3
S4
x38
S5d5
逆に、d(x,m5) ≦ d(x, x38) + d5だったら?
⇒S5がx38よりxに近い可能性がある。
(絶対近いとは言えないけど、 S5を調べる
必要がでてくる)
m5
d5
x38 x
d(x, x38)
d(x, m5)S5のデータが
取り得る範囲
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
 分枝法:クラスタリングによって木構造のように組織化する
 限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
d(x,m5) > d(x, x38) + d5
↓
d(x,m2) > d(x, x38) + d2
↓
d(x,m3) > d(x, x38) + d3
という条件を満たせば、
x38が最近傍!
S1
S2
S3
S4
x38
S5d5
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
おおざっぱに言うと、
本当はこれが最
近傍だけど、
xA
xC
xD
xE
xB
q
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
おおざっぱに言うと、
本当はこれが最
近傍だけど、
こっちで妥協する(近似解)
xA
xC
xD
xE
xB
q
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
一応、どこまでも許容するんじゃなくて、最近傍の学習
データより(1+ε)倍の距離にあるデータまで許容する
xA
xB
xC
xD
xE
数式で表すと、
d(q,x) ≦(1+ε)d(q,x*)
q
近似解までの
距離
最近傍までの
距離
d(q,x*)
d(q,x)
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
一応、どこまでも許容するんじゃなくて、最近傍の学習
データより(1+ε)倍の距離にあるデータまで許容する
xA
xB
xC
xD
xE
数式で表すと、
d(q,x) ≦(1+ε)d(q,x*)
q
近似解までの
距離
最近傍までの
距離
d(q,x*)
d(q,x)
εは自分で決めるみたい。
クロスバリデーションとかで最適な値を決
めるとか。
近似最近傍探索
どうやって近似解を探すのか?
⇒「最良優良探索」を行う
xA
xB
xC
xD
xE
q
近似最近傍探索
最良優良探索
Step.1:2分木を作成
(作成方法は11章担当者が説明してくれるはず!)
xA
xB
xC
xD
xE
q
(A,B,C,D,E)
(A,C)
(A) (C)
(B,D,E)
(B) (D,E)
(D) (E)
A B
C
D E
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
xA
xB
xC
xD
xE
q
A B
C
D E
d(q,xD)
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
xA
xB
xC
xD
xE
q
A B
C
D E
d(q,A)













 次に進む  
が近似解DD
x
Aqd
xqd
),(
1
),(

近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
Step.4:領域AのデータxAとの距離d(q,xA)を算出し、d(q,xD)も含めて
距離が短い方を保存(ここではd(q,xD)の方が短いとする)
xA
xB
xC
xD
xE
q
A B
C
D E
d(q,xA)
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
Step.4:領域AのデータxAとの距離d(q,xA)を算出し、d(q,xD)も含めて
距離が短い方を保存(ここではd(q,xD)の方が短いとする)
Step.5:次に近い領域Bとの距離d(q,B)を算
出し、とd(q,xD)比較
xA
xB
xC
xD
xE
q
A B
C
D E
d(q,B)













 次に進む  
が近似解DD
x
Bqd
xqd
),(
1
),(

※比較対象がxDなのは、今回はxDがxAよりが
近いから
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
Step.4:領域AのデータxAとの距離d(q,xA)を算出し、d(q,xD)も含めて
距離が短い方を保存(ここではd(q,xD)の方が短いとする)
Step.5:次に近い領域Bとの距離d(q,B)を算
出し、とd(q,xD)比較
Step.6:距離d(q,xB)を算出し、d(q,xD)と比
較して短い方を保存(ここでは
d(q,xB)の方が短いとする)
xA
xB
xC
xD
xE
q
A B
C
D E
d(q,xB)
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
Step.4:領域AのデータxAとの距離d(q,xA)を算出し、d(q,xD)も含めて
距離が短い方を保存(ここではd(q,xD)の方が短いとする)
Step.5:次に近い領域Bとの距離d(q,B)を算
出し、とd(q,xD)比較
Step.6:距離d(q,xB)を算出し、d(q,xD)と比
較して短い方を保存
xA
xB
xC
xD
xE
q
A B
C
D E
次に近い領域Cに対して実施
⇒ d(q,xB)を保存して次へ
d(q,C)
d(q,xC)
近似最近傍探索
最良優良探索
Step.1:2分木を作成
Step.2:入力データと同じ領域内のデータxDとの距離d(q,xD)を算出
Step.3:次に近い領域Aとの距離d(q,A)を算出し、とd(q,xD)比較
Step.4:領域AのデータxAとの距離d(q,xA)を算出し、d(q,xD)も含めて
距離が短い方を保存(ここではd(q,xD)の方が短いとする)
Step.5:次に近い領域Bとの距離d(q,B)を算
出し、とd(q,xD)比較
Step.6:距離d(q,xB)を算出し、d(q,xD)と比
較して短い方を保存
xA
xB
xC
xD
xE
q
A B
C
D E
次に近い領域Dに対して同じ処
理を実施
⇒以下の条件を満たさないので、
xB を近似解として終了
d(q,E)













 次に進む  
が近似解BB
x
Eqd
xqd
),(
1
),(

これが近似解!
近似最近傍探索
なんで を満たすと、近似解と言えるのか?
xA
xB
xC
xD
xE
q
A B
C
D E
),(
1
),(
Eqd
xqd B


近似最近傍探索
なんで を満たすと、近似解と言えるのか?
(1+ε)r = d(q, xB) として円を描く
r < d(q,E) < d(q, xE)
(1+ε)r < (1+ε)d(q,E) < (1+ε)d(q, xE)
d(q, xB) < (1+ε)d(q,E) < (1+ε)d(q, xE)
xA
xB
xC
xD
xE
q
A B
C
D E
),(
1
),(
Eqd
xqd B


(1+ε)r
r
d(q,E)
発表の時は図がおかしかったので修正しました。
バランスが悪いので、できれば本の方の図を見てください
本だとr’ 本だと
d(q, xE)
近似最近傍探索
なんで を満たすと、近似解と言えるのか?
(1+ε)r = d(q, xB) として円を描く
r < d(q,E) < d(q, xE)
(1+ε)r < (1+ε)d(q,E) < (1+ε)d(q, xE)
d(q, xB) < (1+ε)d(q,E) < (1+ε)d(q, xE)
),(
1
),(
Eqd
xqd B


近似解が、厳密解の1+ε倍以内
xA
xB
xC
xD
xE
q
A B
C
D E
(1+ε)r
r
d(q,E)
近似最近傍探索
なんで を満たすと、近似解と言えるのか?
(1+ε)r = d(q, xB) として円を描く
r < d(q,E) < d(q, xE)
(1+ε)r < (1+ε)d(q,E) < (1+ε)d(q, xE)
d(q, xB) < (1+ε)d(q,E) < (1+ε)d(q, xE)
),(
1
),(
Eqd
xqd B


探索の
判定と同じ
),(
1
),(
Eqd
xqd B









xA
xB
xC
xD
xE
q
A B
C
D E
(1+ε)r
r
d(q,E)
kNN法における次元の呪い
5.3節に、ベイズ誤り率の話が出てきた
のが唐突な感じが・・・
5.3節に、ベイズ誤り率の話が出てきた
のが唐突な感じが・・・
最後まで読むと、次元の呪いを説明したかったからみたい
漸近過程が成り立つ場合、
鋳型の数Nが無限になると、
ベイズ誤り率の期待値ε*の下限と上限が決まる。
でも、次元が多くなると漸近過程が成り立たない!
⇒誤り率の上限が決まらないのが問題(ってことだと思う)
おことわり
数式の説明は省いて、気になった点のみにしました
次元の呪い
漸近過程って?
鋳型の数が∞に近づけば、入力xと一致する鋳型が存在し
そうなので、何となくこんなもんだと思う
  0,lim 1 

NNN
N
xxdT
  の距離と、最近傍鋳型 入力
個の鋳型の集合
鋳型の数
NNNN
N
xxxxd
NT
N
11 :,
:
:
次元の呪い
漸近過程が成り立つと?
ベイズ誤り率の期待値ε*が、kNNの誤り率εkNNとの関係と
上限、下限が決まる
 証明は5.3.1節を見てください!
 資料作るのがめんどくさかった。すいません。質問で対応します。
 多クラスの場合も成り立つみたいだけど、証明は確認してない…
*2**
2
1
NN1NN3NN4NN2   
次元の呪い
補足をちょっとだけ
これはリジェクト時は誤りとカウントされないから
k=偶数の方が、リジェクトが良く生じる
という理解だけど、間違ってたらご指摘ください!
*2**
2
1
NN1NN3NN4NN2   
k=偶数だと誤り率が低く k=奇数だと誤り率が高い
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
単位超球の中に鋳型が一様分布しているとする
1
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
単位超球の中に鋳型が一様分布しているとする
1
  0,lim 1 

NNN
N
xxdT
鋳型の数Nが∞になれば、
d(x, x1NN)は0になりそう
(漸近過程が成り立ちそう)
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
 鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
11
1-ε
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
 鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
11
1-ε
殻の部分の体積比
d
d
dd
V
VV
)1(1
)1(
)1()1(




次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
 鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
11
1-ε
殻の部分の体積比
d
d
dd
V
VV
)1(1
)1(
)1()1(




単位超球内の鋳型の内、
殻部分に存在する比率
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
11
0.9
d = 2(2次元)だと?
1-(1 - 0.1)2 = 0.19
単位超球内の鋳型の19%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
11
0.9
d = 5(5次元)だと?
1-(1 - 0.1)5 = 0.41
単位超球内の鋳型の41%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
11
0.9
d = 10(10次元)だと?
1-(1 - 0.1)10 = 0.65
単位超球内の鋳型の65%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
11
0.9
d = 50(50次元)だと?
1-(1 - 0.1)50 = 0.99
単位超球内の鋳型の99%が殻の中にある!
どういうこっちゃ?
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
11
0.9
なんとなく分かるのは、
d = 50(50次元)だと、単位超球内の鋳型
の99%が殻の中にある。
これだと、漸近過程は成り立たない・・・
  0,lim 1 

NNN
N
xxdT
次元の呪い
  0,lim 1 

NNN
N
xxdT
*2**
2
1
NN1NN3NN4NN2   
漸近過程がなりたつと、
ベイズ誤り率の上限と下限が決まる
次元の呪い
  0,lim 1 

NNN
N
xxdT
*2**
2
1
NN1NN3NN4NN2   
漸近過程がなりたつと、
ベイズ誤り率の上限と下限が決まる
次元が大きいと漸近過程が
成り立たない!
ということで、データの
次元は小さい方がいい。
章末問題
なにそれおいしいの?
まあ解答のままになりそうですし・・・
代わりに実行サンプルで
許してください
みんなこっちの方が好きでしょ?
Rでボロノイ図書いてみた
#パッケージのインストール
install.packages("tripack")
library(tripack)
data(iris)
iris.vm = voronoi.mosaic(as.vector(iris$Sepal.Length),
as.vector(iris$Sepal.Width), duplicate="remove")
plot(iris$Sepal.Length, iris$Sepal.Width, pch=16)
plot.voronoi(iris.vm, add=T)
RでNN実行してみた
install.packages("class")
library("class")
data(iris)
#irisデータを学習データとテストデータに分ける
train = rbind(iris[1:25,1:4], iris[51:75,1:4], iris[101:125,1:4])
test = rbind(iris[26:50,1:4], iris[76:100,1:4], iris[126:150,1:4])
c = factor(c(iris[1:25,5], iris[51:75,5], iris[101:125,5]))
levels(c) = c("se", "ve", "vi")
knn1(train, test, c) #学習と予測がセット
実行結果
RでkNN実行してみた
install.packages("class")
library("class")
data(iris)
train = rbind(iris[1:25,1:4], iris[51:75,1:4], iris[101:125,1:4])
test = rbind(iris[26:50,1:4], iris[76:100,1:4], iris[126:150,1:4])
c = factor(c(iris[1:25,5], iris[51:75,5], iris[101:125,5]))
levels(c) = c("se", "ve", "vi")
knn(train, test, c, k = 3, prob=TRUE) #kNNの実行
attributes(.Last.value) #詳細の表示
実行結果
knn.cv関数でクロスバ
リデーションも一緒に
できるようだけど、挙
動が謎だった・・・
ちなみに
Scikit-learn(Python)でもできる。
実行サンプル付けようとしたけど力尽きた。
(すいません)

はじめてのパターン認識 第5章 k最近傍法(k_nn法)