More Related Content
Similar to パターン認識モデル初歩の初歩
Similar to パターン認識モデル初歩の初歩 (20)
パターン認識モデル初歩の初歩
- 2. © 2018 SG Corporation 2
◍ 機械学習といっても、結局のところ、入力に対するパターンをカテゴライズし
て、分類しているという以上のものではない。
◍ 一般的にそれらに対して、どのようなモデルが考えられているか。
◍ 事後確率
◍ 距離
◍ 関数値
◍ 決定木
◍ この4つのモデルを非常に簡略化したシナリオで説明する。
◍ 本来は多次元データ分析が主となるが、一次元データとする。
◍ サンプルプログラムにはRを用いた。
はじめに
- 3. © 2018 SG Corporation 3
◍ 4つのモデルで、すべて同じシナリオを用いる。
◍ 入力データは 1次元の小数点1桁までの数値。
◍ 総データ数:6500
◍ 各データはA,B,Cのいずれかのクラスに属する。
◍ A,B,Cはそれぞれ、以下のような正規分布とする。
シナリオ
クラス 出現回数 平均 標準偏差
A 3000 3 1
B 2000 12 1
C 1500 8 1
- 6. © 2018 SG Corporation 6
◍ データの生成
シナリオ
value <- round(rnorm(3000, 3, 1), 1)
class <- 1
dataA <- data.frame(value, class)
value <- round(rnorm(2000, 12, 1), 1)
class <- 2
dataB <- data.frame(value, class)
value <- round(rnorm(1500, 8, 1), 1)
class <- 3
dataC <- data.frame(value, class)
data <- rbind(dataA, dataB, dataC)
- 7. © 2018 SG Corporation 7
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の確率を算出しておく。
◍ ベイズの識別規則
◍ 事後確率がもっとも大きなクラスに観測データを分類する。
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
◍ 事後確率: P(Ci|x)
観測データxが与えられた下で、それがクラスCiに属する条件付き確率
事後確率
- 8. ◍ データxとクラスCiの同時確率
𝑃(𝑥, 𝐶𝑖) = 𝑃 𝐶𝑖 𝑥 𝑝(𝑥) = 𝑝(𝑥|𝐶𝑖)𝑃(𝐶𝑖)
◍ 同時確率:P(x, Ci)
データxとクラスCiが同時に生起する確率
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
◍ 事後確率: P(Ci|x)
観測データxが与えられた下で、それがクラスCiに属する条件付き確率
© 2018 SG Corporation 8
事後確率
- 9. © 2018 SG Corporation 9
◍ ベイズの識別規則
◍ 事後確率の求め方
◍ データxが与えられた下で、それがクラスCiに属する確率
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
◍ 事前確率:P(Ci)
クラスCiの生起確率
◍ クラス条件付き確率(尤度): p(x|Ci)
クラスが与えられた下でのデータxの確率分布
◍ 周辺確率:p(x)
データxの生起確率
事後確率
- 10. © 2018 SG Corporation 10
◍ ベイズの識別規則
◍ 事後確率の求め方
◍ 観測データxが与えられた下で、それがクラスCiに属する確率
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
◍ 事前確率:P(Ci) を比: p(x|Ci) / p(x) で修正したもの。
◍ 比: p(x|Ci) / p(x) が1より大きければ、事後確率は事前確率より大きくなる。
◍ 比: p(x|Ci) / p(x) が1より小さければ、事後確率は事前確率より小さくなる。
事後確率
- 11. © 2018 SG Corporation 11
◍ 今回のシナリオの場合。
◍ 事前確率:P(A), P(B), P(C)
クラスA,B,Cの各々の出現回数/総データ数
◍ クラス条件付き確率(尤度): p(x|A), p(x|B), p(x|C)
同じ値のデータxのクラスA,B,Cでの各々の出現回数/同じ値のデータxの総数
◍ 周辺確率:p(x)
データxの出現回数/総データ数
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率
事後確率
- 12. © 2018 SG Corporation 12
◍ では、やってみよう…
事後確率
- 13. © 2018 SG Corporation 13
𝑃 𝐶𝑖 𝑥 =
𝑝(𝑥|𝐶𝑖)
𝑝(𝑥)
× 𝑃(𝐶𝑖)
事後確率
pd <- prop.table(table(data[,2]))
pa <- pd["A"] * prop.table(table(dataA[,1]))
pb <- pd["B"] * prop.table(table(dataB[,1]))
pc <- pd["C"] * prop.table(table(dataC[,1]))
px <- prop.table(table(data[,1]))
pa <- pa / px[names(pa)]
pb <- pb / px[names(pb)]
pc <- pc / px[names(pc)]
- 14. © 2018 SG Corporation 14
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。
事後確率
- 15. © 2018 SG Corporation 15
◍ それっぽい、分布が得られた…
◍ 実際には
◍ 誤り率の大きな領域では判断を避ける。リジェクト。
◍ とかも必要。
事後確率
- 16. © 2018 SG Corporation 16
◍ あらかじめ分類が分かっているデータとの距離で、観測データがどのクラスに
分類されるかを決定する。
◍ 最近傍法(NN法)
◍ 観測データと分類済みデータとの類似度を距離で計算し、もっとも距離が近い
分類済みデータを持つクラスに分類する。
距離
?
- 17. © 2018 SG Corporation 17
◍ 今回のシナリオの場合。
◍ 観測データ:x
◍ 分類済みデータ:x1..3000
(A), x1..2000
(B), x1..1500
(C)
◍ 観測データから+-0.5以内の距離に、幾つ分類済みデータがあるかを数える。
◍ 離れている距離に従って、0.6^(距離*10)の重みをかける。
距離
- 19. © 2018 SG Corporation 19
距離
dx <- 0.5
weight <- 0.6
knn <- function(x) {
d <- data[((x - dx) <= data$value) & (data$value <= (x +
dx)),]
dist <- round(abs(d$value - x), 1)
d <- table(data.frame(dist, d$class))
d <- floor(d * (weight ^ (10 * as.numeric(labels(d)$dist))))
return(d)
}
sum_knn <- function(x) {
colSums(knn(x))
}
- 20. © 2018 SG Corporation 20
距離
x <- seq(-0.5, 15.0, 0.1)
nn <- sapply(x, sum_knn)
- 21. © 2018 SG Corporation 21
◍ 観測データxから、近距離に存在するクラスA,B,Cの数。
距離
- 22. © 2018 SG Corporation 22
◍ それっぽい、分布が得られた…
◍ 実際には
◍ 同距離のクラスが同数の場合にはどうするか。
◍ 重み等のパラメータをどう決定するか。
◍ とかも必要。
距離
- 23. © 2018 SG Corporation 23
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の識別関数の係数を算出しておく。
◍ ニューラルネットワーク
◍ 単純な線形関数と非線形の活性化関数の組み合わせで、識別関数を構成する。
関数値
- 24. © 2018 SG Corporation 24
◍ 最終的なアウトプットのイメージ。
◍ 各クラスの確率分布がわかると都合がいい。
関数値
x
- 25. © 2018 SG Corporation 25
◍ ニューラルネットワーク
関数値
入
力
層
出
力
層
- 26. © 2018 SG Corporation 26
◍ これは何をやっているのか?
関数値
- 27. © 2018 SG Corporation 27
◍ 線形関数
◍ wx + b
関数値
x
1
w1x+b1
w2x+b2
- 28. © 2018 SG Corporation 28
◍ 線形関数だけでは何層積み重ねても、線形関数になるだけ…
関数値
x
- 29. © 2018 SG Corporation 29
◍ 線形関数の後に非線形関数を挟むことにする。
◍ relu : rectified linear unit
𝑓 𝑢 = max(𝑢, 0)
関数値
x
1
f(w1x+b1)
f( w2x+b2)
- 30. © 2018 SG Corporation 30
◍ relu : rectified linear unit
◍ これにより、複雑な関数が表現可能になる。
◍ 例えば…
関数値
z11 = f(0.2x + 1)
z12 = f(x)
z21 = f(z11 - 0.5z12 + 1)
z22 = f(0.5z11 + 0.5z12 - 2)
z = z21 + 3z22 - 1.5
- 31. © 2018 SG Corporation 31
◍ softmax
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率
◍ 最終結果を事後確率として解釈したい。
◍ 線形関数とreluの組み合わせだけでは、負の値や絶対値の大きな値が発生して
しまう。
◍ 関数の値域を0〜1の範囲に収める。
◍ 全クラスについての和を取ると、1になるように正規化する。
関数値
- 32. © 2018 SG Corporation 32
関数値
◍ softmax
◍ 出力層のk番目のユニットの出力値
◍ K : クラスの種類数
𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘 ≡
exp(𝑢 𝑘)
𝑗=1
𝐾
exp(𝑢𝑗)
◍ 事後確率がもっとも大きなクラスに観測データを分類する。
- 33. © 2018 SG Corporation 33
◍ ニューラルネットワーク
◍ とりあえず、わかった。
関数値
入
力
層
出
力
層
- 34. © 2018 SG Corporation 34
◍ では、線形関数の係数をどうやって決めるか。
◍ wx + b
関数値
x
1
w1x+b1
w2x+b2
- 35. © 2018 SG Corporation 35
◍ あらかじめ分類が分かっているデータで、データがどのクラスに分類されるか
の識別関数の係数を算出しておく。
◍ 基本的なアイデア
◍ 適当な初期値の係数で実際に学習データを読み込ませて、出力値と正解値を比
較する。
◍ 出力値と正解値の誤差が少なくなる方向に徐々に係数を更新して、計算を繰り
返す。
◍ いわゆる、教師あり学習。
関数値
- 36. © 2018 SG Corporation 36
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
関数値
出
力
層
正
解
値
0.6
0.1
0.3
1
0
0
- 37. © 2018 SG Corporation 37
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
◍ 目標出力
◍ クラス数が3で正解値がクラス1の場合:d = [1 0 0]
関数値
出
力
層
正
解
値
0.6
0.1
0.3
1
0
0
- 38. © 2018 SG Corporation 38
関数値
◍ 損失関数(誤差関数)
◍ 出力値と正解値の近さの尺度
◍ 尤度(n:学習データの番号、k:クラスの番号)
𝑝 𝐶 𝑘|𝑥 = 𝑦 𝑘
𝑝 d x =
𝑘=1
𝐾
𝑝 𝐶 𝑘|x 𝑑 𝑘
◍ N個の学習データについて
𝑛=1
𝑁
𝑝 d 𝑛 x 𝑛;w =
𝑛=1
𝑁
𝑘=1
𝐾
(𝑦 𝑘(x;w)) 𝑑 𝑛𝑘
- 39. © 2018 SG Corporation 39
◍ 尤度は何を表しているのか。
◍ N個の学習データについて
◍ 0.4 x 0.5 x 0.6 x…
◍ 0.99 x 0.98 x 0.95 x…
◍ 1 x 1 x 1 x…
◍ 尤度が大きいほど、より目標出力との違いがなくなる。
◍ 尤度が最大になるような方向を目標とする。
関数値
- 40. © 2018 SG Corporation 40
◍ 尤度のままでは、使いにくいので…
𝑛=1
𝑁
𝑘=1
𝐾
(𝑦 𝑘(x;w)) 𝑑 𝑛𝑘
◍ 対数をとって、符号を反転しておく。
◍ 交差エントロピー
𝐸 𝐰 = −
𝑛=1
𝑁
𝑘=1
𝐾
𝑑 𝑛𝑘log(𝑦 𝑘(x 𝑛; w))
◍ 交差エントロピーが最小になるような方向を目標とする。
関数値
- 41. © 2018 SG Corporation 41
◍ では、損失関数をどうやって最小値に近づけるか。
◍ 勾配降下法
◍ 単純に一次微分値を見て、交差エントロピーが小さくなる方向に係数を動かす。
∇𝐸 𝐰 =
𝜕𝐸 𝐰
𝜕𝐰
関数値
- 42. ◍ 補足
◍ 合成関数の微分
𝑦 = 𝑓 𝑥 , 𝑧 = 𝑔 𝑦
𝑑𝑧
𝑑𝑥
=
𝑑𝑧
𝑑𝑦
𝑑𝑦
𝑑𝑥
𝑦1 = 𝑓1 𝑥 , … , 𝑦𝑛 = 𝑓𝑛 𝑥 , 𝑧 = 𝑔 𝑦1, … , 𝑦𝑛
𝜕𝑧
𝜕𝑥
=
𝑘=1
𝑛
𝜕𝑧
𝜕𝑦 𝑘
𝜕𝑦 𝑘
𝜕𝑥
© 2018 SG Corporation 42
関数値
- 44. © 2018 SG Corporation 44
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
- 45. © 2018 SG Corporation 45
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
- 46. ◍ バックプロパゲーション
𝛿𝑗
(𝑙)
≡
𝜕𝐸 𝑛
𝜕𝑢𝑗
𝑙
=
𝑘
𝜕𝐸 𝑛
𝜕𝑢 𝑘
𝑙+1
𝜕𝑢 𝑘
𝑙+1
𝜕𝑢𝑗
𝑙
=
𝑘
𝛿 𝑘
𝑙+1
(𝑤 𝑘𝑗
(𝑙+1)
𝑓′(𝑢𝑗
(𝑙)
))
© 2018 SG Corporation 46
関数値
i
𝑢𝑗
(𝑙)
𝑢 𝑘−1
(𝑙+1)
𝑢 𝑘
(𝑙+1)
𝑢 𝑘+1
(𝑙+1)
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
- 47. © 2018 SG Corporation 47
◍ バックプロパゲーション
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝑙)
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
関数値
i
𝑢𝑗
(𝑙)
k
𝑙 − 1 𝑙 𝑙 + 1
𝑤𝑗𝑖
(𝑙)
- 48. ◍ バックプロパゲーション
𝑧1 = 𝑓(𝑢1)
𝑢2 = 𝑤2 𝑧1 + 𝑏2
𝜕𝑢𝑗
(𝑙)
𝜕𝑤𝑗𝑖
(𝑙)
= 𝑧𝑖
(𝑙−1)
© 2018 SG Corporation 48
関数値
x
1
f(w1x+b1)
f( w2x+b2)
- 49. © 2018 SG Corporation 49
◍ バックプロパゲーション
◍ 一次微分の一般形
𝜕𝐸 𝑛
𝜕𝑤𝑗𝑖
(𝑙)
= 𝛿𝑗
(𝑙)
𝑧𝑖
(𝑙−1)
関数値
入
力
層
出
力
層
- 50. ◍ バックプロパゲーション
◍ 出力層(softmax)
𝑦 𝑘 ≡
exp(𝑢 𝑘)
𝑗=1
𝐾
exp(𝑢𝑗)
𝛿𝑗
(𝐿)
=
𝜕𝐸 𝑛
𝜕𝑢𝑗
(𝐿)
= −
𝑘
𝑑 𝑘
1
𝑦 𝑘
𝜕𝑦 𝑘
𝜕𝑢𝑗
(𝐿)
= −𝑑𝑗(1 − 𝑦𝑗) −
𝑘≠𝑗
𝑑 𝑘(−𝑦𝑗)
=
𝑘
𝑑 𝑘(𝑦𝑗 − 𝑑𝑗)
= 𝑦𝑗 − 𝑑𝑗
© 2018 SG Corporation 50
関数値
- 51. ◍ 補足
◍ 指数関数の合成関数の微分
𝑦 =
exp(𝑥)
𝑛 + exp(𝑥)
𝑑𝑦
𝑑𝑥
=
exp(𝑥)
𝑛 + exp(𝑥)
−
exp(𝑥)
𝑛 + exp(𝑥)
2
𝑦 =
𝑚
𝑛 + exp(𝑥)
𝑑𝑦
𝑑𝑥
= −
𝑚 exp 𝑥
𝑛 + exp(𝑥) 2
© 2018 SG Corporation 51
関数値
- 52. © 2018 SG Corporation 52
◍ 以上をまとめると…
◍ アルゴリズム
◍ 順伝搬
𝐔 𝒍
= 𝐖(𝑙)
𝐙(𝑙−1)
+ 𝐛(𝑙)
𝟏 𝑁
T
𝐙 𝑙 = 𝑓(𝑙)(𝐔(𝑙))
◍ 逆伝搬
∆(𝑙)= 𝑓(𝑙)′(𝐔(𝑙))⨀(𝐖 𝑙+1 T∆(𝑙+1))
◍ 更新
𝐖(𝑙) ← 𝐖 𝑙 − 𝜖
1
𝑁
∆(𝑙) 𝐙 𝑙−1 T
𝐛(𝑙) ← 𝐛 𝑙 − 𝜖
1
𝑁
∆(𝑙) 𝟏 𝑁
関数値
- 53. © 2018 SG Corporation 53
◍ 今回のシナリオの場合
◍ ネットワーク: 3x3x3
◍ ミニバッチサイズ: 100
関数値
入
力
出
力
- 54. © 2018 SG Corporation 54
◍ では、やってみよう…
関数値
- 55. ◍ 基本的な関数
© 2018 SG Corporation 55
関数値
relu <- function(x) ifelse(x >= 0, x, 0)
drelu <- function(x) ifelse(x >= 0, 1, 0)
dclass <- function(c, size) {
d <- rep(0, size)
d[c] <- 1
d
}
softmax <- function(y) {
y <- exp(y)
y <- y / colSums(y)
}
centropy <- function(s, d) {
-sum(d * log(s))
}
- 56. ◍ ネットワークモデル(1/2)
© 2018 SG Corporation 56
関数値
network_model <- function(bat_size=100) {
z1 <- matrix(1, nrow=1, ncol=bat_size)
z2 <- matrix(0, nrow=3, ncol=bat_size)
z3 <- matrix(0, nrow=3, ncol=bat_size)
z4 <- matrix(0, nrow=3, ncol=bat_size)
z <- list(z1, z2, z3, z4)
b1 <- rep(1, bat_size)
b0 <- t(b1)
u1 <- matrix(0, nrow=3, ncol=bat_size)
u2 <- matrix(0, nrow=3, ncol=bat_size)
u3 <- matrix(0, nrow=3, ncol=bat_size)
u <- list(u1, u2, u3)
d <- matrix(rep(c(1,0,0), bat_size), nrow=3, ncol=bat_size)
…
- 57. ◍ ネットワークモデル(2/2)
© 2018 SG Corporation 57
関数値
…
# coefficient.
w1 <- matrix(c(0.5, 0.5, 0.5), nrow=3, ncol=1)
w2 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3)
w3 <- matrix(c(0.5, 0.5, 0.5, 0.5, 0.5, 0.5), nrow=3, ncol=3)
w <- list(w1, w2, w3)
b <- list(rep(1,3), rep(1,3), rep(1,3))
# function.
f <- list(relu, relu, softmax)
df <- list(drelu, drelu)
delta1 <- matrix(1, nrow=3, ncol=bat_size)
delta2 <- matrix(1, nrow=3, ncol=bat_size)
delta3 <- matrix(1, nrow=3, ncol=bat_size)
delta <- list(delta1, delta2, delta3)
return(list(z=z, b0=b0, b1=b1, u=u, d=d, w=w, b=b, f=f, df=df, delta=delta))
}
- 58. ◍ 学習(1/4)
© 2018 SG Corporation 58
関数値
id <- sample(1:6500)
data <- data.frame(id, data)
data <- data[order(data$id),]
data <- data.frame(value=data$value, class=data$class)
nm <- network_model()
eps <- sqrt(.Machine$double.eps) * 1000
- 59. ◍ 学習(2/4)
© 2018 SG Corporation 59
関数値
# mini batch.
mini_batch <- function(data, bat_size=100) {
layer <- length(nm$u)
for (main_loop in 1:10000) {
for (n in 1:65) {
i <- (n - 1) * bat_size + 1
nm$z[[1]] <- t(data[i:(i + bat_size - 1), 1])
nm$d <- sapply(data[i:(i + bat_size - 1), 2], dclass, 3)
# forward.
for (i in 1:layer) {
nm$u[[i]] <- nm$w[[i]] %*% (nm$z)[[i]] + nm$b[[i]] %*% nm$b0
nm$z[[i+1]] <- nm$f[[i]](nm$u[[i]])
}
…
- 60. ◍ 学習(3/4)
© 2018 SG Corporation 60
関数値
…
# backward.
nm$delta[[layer]] <- nm$z[[layer+1]] - nm$d
for (i in 1:(layer-1)) {
nm$delta[[i]] <- nm$df[[i]](nm$u[[i]]) * (nm$w[[i+1]] %*% nm$delta[[i+1]])
}
for (i in 1:layer) {
nm$w[[i]] <- nm$w[[i]] - eps * (nm$delta[[i]] %*% t(nm$z[[i]]) / bat_size)
nm$b[[i]] <- nm$b[[i]] - eps * (nm$delta[[i]] %*% nm$b1 / bat_size)
}
}
}
}
- 62. © 2018 SG Corporation 62
◍ 学習済みニューラルネットワークの係数を使ったsoftmax。
関数値
- 63. © 2018 SG Corporation 63
◍ それっぽい、関数が得られた…
◍ 実際には
◍ 係数の発散を抑える。
◍ 局所解に陥らないようにする。
◍ とかも必要。
関数値
- 64. © 2018 SG Corporation 64
◍ 1つの特徴軸の1つの分割点のみで、分割することを繰り返す。
◍ どの分割点で分割するかは、不純度と呼ばれる評価関数で決定する。
◍ 分割された領域に、1クラスしか存在しないと判定した時点で、分割を終了す
る。
決定木
x < s0
x < s1
A C
B
yes no
yes no
- 65. ◍ ジニ係数
◍ ノードtにおける誤り率
ℐ(𝑡) ≡
𝑖=𝑗
𝐾
𝑖≠𝑗
𝑃 𝐶𝑖|𝑡 𝑃(𝐶𝑗|𝑡)
=
𝑖=1
𝐾
𝑃(𝐶𝑖|𝑡)
2
−
𝑖=1
𝐾
𝑃2
(𝐶𝑖|𝑡)
= 1 −
𝑖=1
𝐾
𝑃2(𝐶𝑖|𝑡)
=
𝑖=1
𝐾
𝑃(𝐶𝑖|𝑡) 1 − 𝑃(𝐶𝑖|𝑡)
© 2018 SG Corporation 65
決定木
- 68. © 2018 SG Corporation 68
◍ 今回のケース
◍ 成分は1次元のみ。
◍ クラスは3種類。
決定木
- 69. © 2018 SG Corporation 69
◍ では、やってみよう…
決定木
- 70. ◍ 基本的な関数
© 2018 SG Corporation 70
決定木
gini <- function(t) {
p <- table(t[,2])
p <- p / length(t[,2])
sum(p * (1 - p))
}
sgini <- function(s, t) {
tl <- t[t$value < s,]
pl <- gini(tl)
tr <- t[t$value >= s,]
pr <- gini(tr)
pl * length(tl) / length(t) + pr * length(tr) / length(t)
}
- 71. ◍ 実行
© 2018 SG Corporation 71
決定木
px <- gini(data)
x <- seq(-1.0, 15.0, 0.1)
g0 <- px - sapply(x, sgini, data)
- 72. © 2018 SG Corporation 72
◍ 不純度の減り方 1つ目 : 10.2
決定木
- 73. © 2018 SG Corporation 73
◍ 不純度の減り方 2つ目(左) : 5.8
決定木
- 74. © 2018 SG Corporation 74
◍ 事後確率: P(A|x), P(B|x), P(C|x)
観測データxが与えられた下で、それがクラスA,B,Cに属する条件付き確率。
事後確率(再掲)
- 75. © 2018 SG Corporation 75
◍ それっぽい、分割点が得られた…
◍ 実際には
◍ いつ分割をやめるかの判定。
◍ 複雑になりすぎた枝を刈り取る。
◍ とかも必要。
決定木
- 76. © 2018 SG Corporation 76
◍ 事後確率
◍ 学習データから事前確率、周辺確率、尤度から事後確率を算出する。
◍ 事後確率がもっとも高いクラスに分類する。
◍ 距離
◍ 学習データと入力データの距離を算出する。
◍ 学習データとの距離がもっとも近いクラスに分類する。
◍ 関数値
◍ 学習データからの関数の係数を決定する。
◍ 入力データに関数を適用し、出力値により、クラスを分類する。
◍ 決定木
◍ 学習データから、分割点を決定し、決定木を作成する。
◍ 入力データに決定木を適用し、クラスを分類する。
まとめ
- 77. © 2018 SG Corporation 77
◍ はじめてのパターン認識
◍ 平井 有三(著)
◍ 森北出版
◍ 深層学習(機械学習プロフェッショナルシリーズ)
◍ 岡谷貴之(著)
◍ 講談社サイエンティフィク
◍ アート・オブ・Rプログラミング
◍ Norman Matloff(著)、大橋真也(監訳)、木下哲也(訳)
◍ オライリー・ジャパン
参考文献
- 78. © 2018 SG Corporation 78
顧客と社員に信頼されるエス・ジー