このサイトの非負行列分解を, 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を指定すればいいですね.