【R】K近傍法を試してみた【ElemStatLearn】

| 0件のコメント

今回の参考書籍ははじめてのパターン認識です。

K近傍法

k近傍法 (k-nearest neighbor algorithm)は, 特徴空間上で最も近い距離にある訓練データに基づいて分類を行う手法であり, 直感的にわかりやすいパターン認識手法です。

最短近傍法は与えられた未知データに対して一番近い訓練データのクラスに属しているだろうという考えです。
ざっくり言うと, 距離が近い順からk個選択して多数決してクラスを決定するのが kNN法 です。一般的には, ユークリッド距離が使われます。

お手軽な手法ですが, 訓練データにノイズが多かったりkを小さくした場合に精度が下がりやすい特徴があります。
また, 通常は特徴空間全てを保持しないといけないのでメモリ負荷が高くなります。

RでkNNを試してみる

{class} を使います。kNN関数の定義は以下です。

knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)

Wine DataSet

Wineデータセットを使います。
wineデータセットは3つの異なる品種のワインを化学的な分析により, 13の特徴量で線形分離されたデータセットです。

178個のデータがあるので各クラスの前半30個を訓練データに使用し, 残りを評価に使います。

library(class)

# wine <- data(wine)
wine <- read.csv("wine.data", header=FALSE)
colnames(wine) <- c("class","Alcohol","Malic Acid","Ash","Alcalinity of Ash","Magnesium",
                    "Total Phenols","Flavanoids","Nonflavanoid Phenols","Proanthocyanins",
                    "Color Intensity","Hue","0D280/OD315 of Diluted Wines","Proline")

train <- rbind(wine[1:30,2:14], wine[60:90,2:14], wine[131:161,2:14]) 
train.label <- factor(c(wine[1:30,1], wine[60:90,1], wine[131:161,1]))

test <- rbind(wine[31:59,2:14], wine[61:130,2:14], wine[161:178,2:14]) 
test.label <- factor(c(wine[31:59,1], wine[61:130,1], wine[161:178,1]) )

res <- knn(train,test,train.label,k=3,prob=TRUE)

attributes(res)

sum(res==test.label)/length(test.label)

k=3で正解率は0.735でした。

分離超平面を可視化するために {ElemStatLearn}を使う方法があります。

library(class)
library(ElemStatLearn)

x <- mixture.example$x
g <- mixture.example$y
xnew <- mixture.example$xnew
mod15 <- knn(x, xnew, g, k=15, prob=TRUE)

prob <- attr(mod15, "prob")
prob <- ifelse(mod15=="1", prob, 1-prob)
px1 <- mixture.example$px1
px2 <- mixture.example$px2
prob15 <- matrix(prob, length(px1), length(px2))
par(mar=rep(2,4))
contour(px1, px2, prob15, levels=0.5, labels="", xlab="", ylab="", main=
          "15-nearest neighbour", axes=FALSE)
points(x, col=ifelse(g==1, "coral", "cornflowerblue"))
gd <- expand.grid(x=px1, y=px2)
points(gd, pch=".", cex=1.2, col=ifelse(prob15>0.5, "coral", "cornflowerblue"))
box()


[1] はじめてのパターン認識 第5章 k最近傍法(k_nn法)
[2] kNNによるデータ分類
[3] Using the k-Nearest Neighbors Algorithm in R

コメントを残す

必須欄は * がついています