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近傍もわかってないのかこのあほめ」と思った機械学習に詳しい方、間違いを指摘してくださると助かります。。。