Rでstring_Kernel の変更点 - アールメカブ

アールメカブ


Rでstring_Kernel の変更点


[[Rの備忘録]]

[[string kernel の作成 その 1  2007 08 18>R_fromOldHtml3_2#yd069bf1]]も参照のこと

Text Classification using String Kernels:
Journal of Machine Learning Research 2 (2002) 419-444


二つのアルファベットが隣接する場合に&mathml(\lambda^2); とし,n 個離れていれば&mathml(\lambda^(n + 1));  と定め,これをすべてのアルファベットについて数え上げ,二つの文書間で計算するものである。

Lohdi の例からあげる.&mathml(\lambda^2); を簡単にλ^2と示す.
 φ(cat) λ^2 λ^3  λ^2     0       0       0        0        0
 φ(car) λ^2    0       0      0       0     λ^3    λ^2      0
 φ(bat)   0      0     λ^2  λ^2   λ^3    0         0        0
 φ(bar)   0      0        0    λ^2    0       0       λ^2    λ^3

ここで K(car,cat) = λ^4.つまりcarとcatの2行で,いわば論理積を求めるようなもの.(同じ次数のラムダは個数分の係数をつけておく)

さらに正規化するならば,まず K(car,car) = K(cat,cat) = 2λ^4 + λ^6 を求め
 K(car,cat) = λ^4/(2λ^4 + λ^6) = 1/(2 + λ^2). 
と正規化される.

さて,これをRで実行するには ''kernlab'' パッケージを利用する.パッケージ内のstringdot()関数を使う.λはデフォルトでは 0.5 である.

 test.str <- list("cat","car","bat","bar")
 str.dot <- stringdot(length = 1, lambda = 0.5, 
     type = "sequence", normalized = TRUE)
 list(kernelMatrix(str.dot, test.str)
 
 test.str <- list("science is organized knowledge",
                     "wisdom is organized life")
 str.kern.list <- NULL
 for(i in 1:6){
   str.dot <- stringdot(length = i, lambda = 0.5, 
               type = "sequence", normalized = TRUE)
   str.kern.list[i] <- list(kernelMatrix(str.dot, test.str))
 }