EPG's BLOG

某金融会社の社内SE。気になったことをちょいちょい書いていきます

データサイエンス講義 3章「アルゴリズム」 その3

今回はk近傍法のコーディングについて。

データサイエンス講義

データサイエンス講義

 

 

3.2.2 k近傍法

■演習
こちらと全く同じことをする。

レベル1のR、その2 – RでK-NNパッケージを使ってみる - | OKEREKE-RL

 

【対象】
2次元正規分布を2種類作成し、トレーニングデータとテストデータに分類。
テストデータが正しく分類されるか測定。

 

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

#2種類のラベルが付与されたトレーニングデータを用意。
#k-nn法により、テストデータ分類
#対象:2次元正規乱数
# # ラベル1:平均(1,0)、分散は0.5(共分散は0)
# # ラベル2:平均(0,1)、分散は0.5(共分散は0)

#knn法を利用するために読み込む
library(class)
#多次元正規乱数作成に利用するために読み込む
library(MASS)

#ラベル1のデータ作成
mu1 <- c(1,0)
Sigma1 <- matrix(c(0.5,0,0,0.5),2,2)
datanum1 <- 200
dat1 <- mvrnorm(datanum1,mu1,Sigma1)

#ラベル2のデータ作成
mu2 <- c(0,1)
Sigma2 <- matrix(c(0.5,0,0,0.5),2,2)
datanum2 <- datanum1
dat2 <- mvrnorm(datanum2,mu2,Sigma2)

#作成したデータのプロット
#xlim,ylimにて、表示スケールを調整
plot(dat1,col="red",xlim=c(-2,3),ylim=c(-2,3))
#作成したグラフに上書きするおまじない
par(new = TRUE)
points(dat2,col="blue")

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

以下のようなデータプロットが出力。

f:id:EPG:20141107220100p:plain

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

#トレーニングデータ(データ数は100)
trainnum <- 100
train <- rbind(dat1[1:trainnum,],dat2[1:trainnum,])
#テストデータ
test <- rbind(dat1[(trainnum+1):datanum1,],dat2[(trainnum+1):datanum2,])

#ラベル付け
label <- factor(c(rep("red",100),rep("blue",100)))

#kの値を設定
k <- 1

#knn法
train_result <- knn(train,test,label,k,prob=TRUE)
#結果集計
(cross<-table(train_result,label))
#評価指標は、再現率を利用
(rate<-(cross[1,1]+cross[2,2])/( (datanum1-100)*2) )

#最適な評価指標となるkを算出
for(i in 2:50){
train_resulttmp <- knn(train,test,label,i,prob=TRUE)
crosstmp<-table(train_resulttmp,label)
ratetmp<-(crosstmp[1,1]+crosstmp[2,2])/((datanum1-100)*2)

#最適のkが更新された場合にkの値と評価指標を算出。
if(rate<ratetmp){
k<-i
cross<-crosstmp
rate<-ratetmp
cat("i:", i, " \trate:",ratetmp,"\n")
}
}

#最適化したkについて、分類結果を出力

cross

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 

今回は、k=14の場合が最適。結果更新の過程は以下。

i: 3 rate: 0.82
i: 5 rate: 0.83
i: 6 rate: 0.835
i: 8 rate: 0.84
i: 13 rate: 0.85
i: 14 rate: 0.855

 

k=14の時の分類結果は以下。

label
train_resulttmp blue red
blue 83 12
red 17 88

 

■参考にしたページ(コーディング)
knn法を実行するknn関数の引数等について。

さいごの碧: k-近傍法のRコード

http://cran.r-project.org/web/packages/class/class.pdf

 

plot関数、軸スケールの変更方法。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/48.html

 

多次元正規乱数を作成するmvrnorm関数について。

R: Simulate from a Multivariate Normal Distribution

 

クロス集計表の作成。

F.1.11. クロス集計表 | R Financial & Marketing Library

 

変数と文字を混合して表示させるcat関数。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/35.html