KNN法(K最近傍法)でクラス分類

超お手軽分類手法!!KNN法をRで実装してみた



KNN法はデータ数が多量であれば、それなりの性能があるとされています。
実装方法は超簡単

  1. 入力データと全学習データとのユークリッド距離を計算。
  2. 距離が短いものから順にk個だけ学習データから取り出す。
  3. 取り出した集合で入力データのクラスを多数決で決める。

つーことでRでの実装

# KNN法
# x:入力データ, data:学習データ
# t:学習データのクラスラベルのベクトル(1以上の正の整数)
myKNN <- function(x,data,t,k){
	classNum <- max(t) #クラス数
	dataN <- length(t) #学習データ数
	calcDistance <- function(d){ #ベクトル間のユークリッド距離計算
		return ( sum( (d-x)^2 ) ) # sqrtなし
	}
	distances <- apply(data,1,calcDistance) # 全学習データとの距離計算
	rank <- trunc(rank(distances))          # 昇順ランキングベクトル(trunc()で小数点以下切捨て)
	clsCount <- function(cls){              # 上位k番内のクラスclsの数を数える
		return ( sum((t)[seq(dataN)[rank<=k]] == cls) )
	}
	count.v <- mapply( clsCount, seq(classNum) )
	count.r <- rank(count.v)         # 昇順にランキング
	result <- order(count.r)         # 昇順にソート後、ソート前の位置
	return ( result[length(result)] )# カウントが最も多いクラスを返す
}

短すぎて吹いたw
とりあえずプロットしてみる。(testData0.csv)

なんかギザギザしてる・・・
まぁ、仕方ないのかな。
多クラスで試してみる。(testData3.csv)

まぁ、いいかんじ?
K=3でも試してみる。

なんか灰色の領域が飛び出しとるww
あきらかにダメだろこれはww


KNN法の感想
学習時間が0
実装楽勝www
識別速度超OSEEEEEEEEEEEEEEEEEEEEE!!!!!!!!
プロット図作るのに100秒前後かかるし!!
他の方法だともっと早かったorz


交差確認法とかできちんと分類性能評価しないとなぁ・・・
つかもうネタが尽きてきはじめた。('A`)
そろそろPRMLの話に行こうかなぁ(´ー`)

パターン認識と機械学習 上 - ベイズ理論による統計的予測

パターン認識と機械学習 上 - ベイズ理論による統計的予測