RでLPP(Locality Preserving Projection)
概要
大学院の講義の課題で、必要に迫られたので作ってみた。
実装
similarity matrixであるW
はk-nearest neighborを元に生成しているが、
これの解釈がいまいちわからなかったので正しいか不明。
ちなみにぼくは「データjからの全データへのユークリッド距離を小さい順に並べた時、データiとデータjの距離がn(≦k)番目に小さいならばデータj∈knn(データi)」と解釈し、「データj∈kNN(データi)」または「データi∈kNN(データj)」のときWi,j=1としました。
とにかく、使用は自己責任で。
ちなみに同じ講義を取ってる方、これコピペするとたぶん怒られますよ(笑)
# LPPの実装 LPP = function(data,k){ # Wの作成(k-nearest neighbor: 最も類似しているk個のデータに重み1を与える) n = nrow(data) W = matrix(0, nr=n, nc=n) dist_matrix = as.matrix(dist(data,diag=T,upper=T)) for(i in 1:n){ dist = dist_matrix[i,] sorted_dist = sort(dist) for(j in 1:n){ if(dist[j] <= sorted_dist[k+1]){ W[i,j] = 1 W[j,i] = 1 } } } # Dの作成 items = rep(0,n) for(i in 1:n){items[i] = sum(W[i,])} D = diag(items) # その他行列の作成 X = t(data) L = D - W # 一般化固有値問題を解く source("http://aoki2.si.gunma-u.ac.jp/R/src/geneig.R", encoding="euc-jp") return(geneig(X %*% L %*% t(X), X %*% D %*% t(X))) }
最後に
「k近傍もわかってないのかこのあほめ」と思った機械学習に詳しい方、間違いを指摘してくださると助かります。。。