トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン 印刷

特異値分解

auditR

特異値分解で文書−単語マトリクス(TDマトリクス)を次元削減する。

テキストを形態素解析すると、単語と文書の行列ができる。文書は分析対象なので削除するわけにはいかないが、単語についてはストップワードを除いてもなおたくさんの単語の組み合わせが発生するので、単語の組み合わせから文書の意味を解釈しようとすると困難にぶつかる。

そこでTDマトリクスを次元削減するために、行列の特異値分解をする。

  分析対象の行列をつくる

> A = matrix(1:18, ncol = 3) # m*n行列
> A
     [,1] [,2] [,3]
[1,]    1    7   13
[2,]    2    8   14
[3,]    3    9   15
[4,]    4   10   16
[5,]    5   11   17
[6,]    6   12   18

  特異値分解する(関数で一発!)

> svd_A = svd(A)   #特異値分解のR関数
> svd_A
$d   #k個の特異値(ベクトルになっているが、対角行列として扱う)がトピックを表す
[1] 4.580601e+01 3.287752e+00 1.937861e-15  
$u   #m*kの行列  → 単語とトピックとの関係
           [,1]       [,2]       [,3]
[1,] -0.3196930  0.6493119 -0.2742669
[2,] -0.3534762  0.4126654  0.7288510
[3,] -0.3872593  0.1760189 -0.5453828
[4,] -0.4210424 -0.0606276  0.1556476
[5,] -0.4548255 -0.2972741 -0.2192166
[6,] -0.4886086 -0.5339206  0.1543676
$v  #k*nの行列  → トピックと文書との関係
           [,1]       [,2]       [,3]
[1,] -0.1981917 -0.8910967  0.4082483
[2,] -0.5158231 -0.2593450 -0.8164966
[3,] -0.8334546  0.3724068  0.4082483 
> svd_A$u %*% diag(svd_A$d) %*% t(svd_A$v)  #分解した因子からもとの行列を復元する。
     [,1] [,2] [,3]
[1,]    1    7   13
[2,]    2    8   14
[3,]    3    9   15
[4,]    4   10   16
[5,]    5   11   17
[6,]    6   12   18

上記Aの各列は分析対象の文書であり、行は各文書における行見出しの単語が文書に含まれる数を表す。

  出力の解釈

> svd_A$u %*% diag(svd_A$d)
          [,1]       [,2]          [,3]
[1,] -14.64386  2.1347763 -5.314911e-16
[2,] -16.19133  1.3567414  1.412412e-15
[3,] -17.73880  0.5787064 -1.056876e-15
[4,] -19.28627 -0.1993285  3.016235e-16
[5,] -20.83374 -0.9773635 -4.248114e-16
[6,] -22.38121 -1.7553984  2.991431e-16

三列目の文書は分析にほとんど影響していない。??という解釈をしていいのか

> diag(svd_A$d) %*% t(svd_A$v)
              [,1]          [,2]          [,3]
[1,] -9.078371e+00 -2.362780e+01 -3.817723e+01
[2,] -2.929705e+00 -8.526620e-01  1.224381e+00
[3,]  7.911286e-16 -1.582257e-15  7.911286e-16

???


Last updated 2019-12-12 | auditR (c) N.Nawata