はじめてのパターン認識 第5章 k最近傍法(k_nn法)
DESCRIPTION
TRANSCRIPT
第5章
k最近傍法(kNN法)
2013/9/3
@「はじめてのパターン認識」読書会
twitterID:wwacky
8月1日から新しい職場で働いてます
最近コードを書いてない・・・
1週間後の博士論文の審査で使う発表資料がほぼ白紙で
死にそう
やばすぎて艦これ断ちするレベル
自己紹介
説明のために一部順序を
少し入れ替えています
あと、図表ははじめてのパターン認識からの引用です
おことわり
最近傍法って何だ
最近傍法って何?
簡単に言うと
「近いデータに合わせる」
判別対象のデータが、どの
鋳型(いわゆる学習データ)
に一番近いかで判別する
コインのサイズ
コインの重量
一番近い鋳型が真、だからこれも真
真
偽
どうやって近さを求めるの?
一般的には
「ユークリッド距離」を使う
あるデータxと、クラスiのj番目の
データx j(i)のユークリッド距離
d(x,x j(i)) = |x-x j
(i)|
原理的には他の距離でもいい
けど、ユークリッド距離を使
うのが一般的らしい
コインのサイズ
コインの重量
真
偽
この距離
最近傍法の識別規則は?
other
txxd
reject
xxdi
j
i
ji
の時 識別クラス
)()(,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
Txxnxxxnxx ,2/,0
n
x
最近傍法での判別
jiji
Txxnxxxnxx ,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
S7 S5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
分枝法:クラスタリングによって木構造のように組織化する
限定法:分枝法で作成した木構造をもとに近傍の探索を行う
分枝法
クラスタリングで学習データを組織化する。
階層クラスタリングを使うみたいだが、非階層クラスタリングでも効率化できるのかは不明
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 S5 d5
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
分枝法:クラスタリングによって木構造のように組織化する
限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
S1 S2
S3
S4
x38 S5 d5
一旦位置関係は忘れて、S5のデータが取り得る範囲を考える。
分枝限定法
分枝法と限定法を用いて、近傍の探索を効率化させる
分枝法:クラスタリングによって木構造のように組織化する
限定法:分枝法で作成した木構造をもとに近傍の探索を行う
限定法
S4以外のクラスタのデータが、
x38より近くないか判断する。
まずはS5のデータで判断。
d(x,m5) > d(x, x38) + d5 なら、
S5の全データはx38より遠い
S1 S2
S3
S4
x38 S5 d5
一旦位置関係は忘れて、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 S5 d5
逆に、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 S5 d5
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
近似最近傍探索
これまでの最近傍探索と考えが若干異なり、
最近傍より少し距離が遠くても許容する
おおざっぱに言うと、
本当はこれが最近傍だけど、
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)
次に進む
が近似解DDx
Aqdxqd
),(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)
次に進む
が近似解DDx
Bqdxqd
),(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)
次に進む
が近似解BBx
Eqdxqd
),(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
NNNN
xxdT
の距離と、最近傍鋳型 入力
個の鋳型の集合
鋳型の数
NNNN
N
xxxxd
NT
N
11 :,
:
:
次元の呪い
漸近過程が成り立つと?
ベイズ誤り率の期待値ε*が、kNNの誤り率εkNNとの関係と
上限、下限が決まる
証明は5.3.1節を見てください!
資料作るのがめんどくさかった。すいません。質問で対応します。
多クラスの場合も成り立つみたいだけど、証明は確認してない…
*2**2
1NN1NN3NN4NN2
次元の呪い
補足をちょっとだけ
これはリジェクト時は誤りとカウントされないから
k=偶数の方が、リジェクトが良く生じる
という理解だけど、間違ってたらご指摘ください!
*2**2
1NN1NN3NN4NN2
k=偶数だと誤り率が低く k=奇数だと誤り率が高い
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
単位超球の中に鋳型が一様分布しているとする
1
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
単位超球の中に鋳型が一様分布しているとする
1 0,lim 1
NNN
NxxdT
鋳型の数Nが∞になれば、d(x, x1NN)は0になりそう (漸近過程が成り立ちそう)
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
1 1
1-ε
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
1 1
1-ε
殻の部分の体積比
d
d
dd
V
VV)1(1
)1(
)1()1(
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
厚さεの殻の部分にどのくらい鋳型が存在するのか?
鋳型の数は、殻の部分の体積に依存する(鋳型が一様分布なら当
然だよね!)
1 1
1-ε
殻の部分の体積比
d
d
dd
V
VV)1(1
)1(
)1()1(
単位超球内の鋳型の内、殻部分に存在する比率
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
1 1
0.9
d = 2(2次元)だと?
1-(1 - 0.1)2 = 0.19
単位超球内の鋳型の19%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
1 1
0.9
d = 5(5次元)だと?
1-(1 - 0.1)5 = 0.41
単位超球内の鋳型の41%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
1 1
0.9
d = 10(10次元)だと?
1-(1 - 0.1)10 = 0.65
単位超球内の鋳型の65%が殻の中にある
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
殻の厚さε=0.1として、殻部分の鋳型の部分を計算して
みる
1 1
0.9
d = 50(50次元)だと?
1-(1 - 0.1)50 = 0.99
単位超球内の鋳型の99%が殻の中にある!
どういうこっちゃ?
次元の呪い
次元が大きくなると、
漸近過程は成り立たない?
1 1
0.9
なんとなく分かるのは、
d = 50(50次元)だと、単位超球内の鋳型
の99%が殻の中にある。
これだと、漸近過程は成り立たない・・・
0,lim 1
NNNN
xxdT
次元の呪い
0,lim 1
NNNN
xxdT
*2**2
1NN1NN3NN4NN2
漸近過程がなりたつと、
ベイズ誤り率の上限と下限が決まる
次元の呪い
0,lim 1
NNNN
xxdT
*2**2
1NN1NN3NN4NN2
漸近過程がなりたつと、
ベイズ誤り率の上限と下限が決まる
次元が大きいと漸近過程が成り立たない!
ということで、データの
次元は小さい方がいい。
章末問題
なにそれおいしいの?
まあ解答のままになりそうですし・・・
代わりに実行サンプルで
許してください
みんなこっちの方が好きでしょ?
Rでボロノイ図書いてみた
#パッケージのインストール
instal l .packages("tr ipack")
l ibrary(tr ipack)
data(ir is )
ir is .vm = voronoi.mosaic (as.vector ( ir is$Sepal .Length) ,
as.vector( ir is$Sepal.Width) , duplicate="remove")
plot( ir is$Sepal.Length, ir is$Sepal.Width , pch=16)
plot.voronoi (ir is .vm, add=T)
RでNN実行してみた
instal l .packages("class")
l ibrary("class")
data(ir is )
#irisデータを学習データとテストデータに分ける
train = rbind(ir is[1:25,1:4] , ir is[51:75,1:4] , ir is[101:125,1:4] )
test = rbind(ir is[26:50,1:4] , ir is[76:100,1:4] , ir is[126:150,1:4])
c = factor(c( ir is[1 :25,5], ir is[51:75,5] , ir is[101:125,5]))
levels(c) = c("se", "ve", "vi")
knn1(train, test, c) #学習と予測がセット
実行結果
RでkNN実行してみた
instal l .packages("class")
l ibrary("class")
data(ir is )
train = rbind(ir is[1:25,1:4] , ir is[51:75,1:4] , ir is[101:125,1:4] )
test = rbind(ir is[26:50,1:4] , ir is[76:100,1:4] , ir is[126:150,1:4])
c = factor(c( ir is[1 :25,5], ir is[51:75,5] , ir is[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)でもできる。
実行サンプル付けようとしたけど力尽きた。
(すいません)