Rで非負行列分解

このサイトの非負行列分解を, Rでやります. http://sonoshou.hatenablog.jp/entry/20121011/1349960722

library(NMF)
library(dplyr)

## この行列をNMFしたい
mat = c(5,0,6,2,2,9,0,
        7,5,0,1,0,6,0,
        4,3,0,0,0,5,0,
        1,0,1,8,1,8,1,
        2,0,4,3,6,6,0)
mat = matrix(mat, 7,5) %>% t
mat
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    5    0    6    2    2    9    0
## [2,]    7    5    0    1    0    6    0
## [3,]    4    3    0    0    0    5    0
## [4,]    1    0    1    8    1    8    1
## [5,]    2    0    4    3    6    6    0
## rank4で行列分解します
nmf_res = mat %>% nmf(4)

## 基底の行列
mat_bases = nmf_res %>% basis
mat_bases
##           [,1]   [,2]      [,3]      [,4]
## [1,] 2.220e-16 8.7234 2.220e-16 1.486e+01
## [2,] 1.874e+01 6.8456 2.297e+00 2.220e-16
## [3,] 1.013e+01 6.5337 2.220e-16 2.220e-16
## [4,] 2.220e-16 1.0910 2.015e+01 3.792e+00
## [5,] 2.220e-16 0.1907 2.635e-04 1.953e+01
## 結合係数の行列
mat_coef = nmf_res %>% coef
mat_coef
##         [,1]      [,2]      [,3]      [,4]      [,5]    [,6]      [,7]
## [1,] 0.21083 2.771e-01 2.220e-16 2.220e-16 2.220e-16 0.09361 2.220e-16
## [2,] 0.37544 2.220e-16 2.220e-16 2.220e-16 2.220e-16 0.55936 2.220e-16
## [3,] 0.01049 2.220e-16 2.220e-16 3.769e-01 3.497e-04 0.30904 4.455e-02
## [4,] 0.10207 2.220e-16 2.881e-01 1.451e-01 2.355e-01 0.29539 2.220e-16
## 掛け算すると, 
mat_bases %*% mat_coef
##       [,1]      [,2]      [,3]      [,4]      [,5]  [,6]      [,7]
## [1,] 4.792 5.299e-15 4.282e+00 2.156e+00 3.500e+00 9.270 5.247e-15
## [2,] 6.546 5.193e+00 6.255e-15 8.655e-01 8.031e-04 6.293 1.023e-01
## [3,] 4.589 2.807e+00 3.765e-15 3.817e-15 3.753e-15 4.603 3.711e-15
## [4,] 1.008 5.620e-15 1.092e+00 8.144e+00 9.000e-01 7.958 8.977e-01
## [5,] 2.065 4.441e-15 5.626e+00 2.834e+00 4.599e+00 5.876 1.174e-05
## 元の行列と, 
mat
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    5    0    6    2    2    9    0
## [2,]    7    5    0    1    0    6    0
## [3,]    4    3    0    0    0    5    0
## [4,]    1    0    1    8    1    8    1
## [5,]    2    0    4    3    6    6    0
## 結構あってる.
mat_bases %*% mat_coef - mat
##           [,1]       [,2]       [,3]       [,4]       [,5]     [,6]
## [1,] -0.207868  5.299e-15 -1.718e+00  1.565e-01  1.500e+00  0.26988
## [2,] -0.454457  1.926e-01  6.255e-15 -1.345e-01  8.031e-04  0.29328
## [3,]  0.589352 -1.926e-01  3.765e-15  3.817e-15  3.753e-15 -0.39677
## [4,]  0.007987  5.620e-15  9.234e-02  1.443e-01 -1.000e-01 -0.04226
## [5,]  0.064987  4.441e-15  1.626e+00 -1.662e-01 -1.401e+00 -0.12413
##            [,7]
## [1,]  5.247e-15
## [2,]  1.023e-01
## [3,]  3.711e-15
## [4,] -1.023e-01
## [5,]  1.174e-05
## 中身
nmf
## standardGeneric for "nmf" defined from package "NMF"
## 
## function (x, rank, method, ...) 
## standardGeneric("nmf")
## <environment: 0x10408e588>
## Methods may be defined for arguments: x, rank, method
## Use  showMethods("nmf")  for currently available ones.

nmf関数の中で, アルゴリズムの指定もできるみたいです. methodを指定すればいいですね.