R语言降维——非负矩阵分解(NMF包的实现)
作者:互联网
目录
0引言
先从数据的条件来理解非负矩阵分解方法:
- 条件:需要分解的矩阵所有元素非负
- 目标:V是非负矩阵。NMF可以找到两个非负矩阵W、H使得W*H近似等于V中的值。
- 其中W:基础图像矩阵。H:系数矩阵
- NMF的目标:最小化W和H矩阵的乘积和原始矩阵的差
- 常见的求解思路:误差范数求解定义和散度的损失函数定义法
1、R语言实现(NMF包的加载)
install.packages("NMF") # 安装包的命令
library(NMF) # 加NMF包
NMF
包里的函数有很多,可以通过以下方式查看:
help(package = "NMF")
本文主要讲解下面几个函数:nmf、basis、basismap、coef、coefmap
。
2、nmf建立模型实现非负矩阵分解
先是构造数据V矩阵:
# 方法一
V = rmatrix(3,3)
# 方法二
n <- 20; counts <- c(2, 2, 4);
V <- syntheticNMF(n, counts)
使用方法二的数据降维建模:
res <- nmf(V, 3) # 3是指定分解维数的秩不省略。
下面输出降维效果。
3、W矩阵
> basis(res)
[,1] [,2] [,3]
[1,] 5.667319e+00 2.675530e+00 2.220446e-16
[2,] 3.465761e+00 2.220446e-16 1.661215e-01
[3,] 6.282332e+00 4.171376e+00 2.220446e-16
[4,] 1.170936e+01 2.220446e-16 9.573067e-01
[5,] 4.037403e+00 2.220446e-16 2.220446e-16
[6,] 4.438801e+00 1.059708e+00 2.220446e-16
[7,] 4.769096e+00 1.900982e+00 2.220446e-16
[8,] 4.327212e+00 2.220446e-16 2.055202e+00
[9,] 1.091429e-01 8.637713e+00 2.601575e+00
[10,] 1.206604e+00 2.180740e+00 2.220446e-16
[11,] 9.982590e-01 3.159403e+00 4.918777e+00
[12,] 1.089757e+00 2.220446e-16 5.268192e+00
[13,] 3.266028e+00 2.532583e-01 2.220446e-16
[14,] 2.220446e-16 1.034724e-01 8.669974e+00
[15,] 3.561339e-01 8.098697e-14 9.788825e+00
[16,] 2.220446e-16 6.476458e+00 2.220446e-16
[17,] 2.220446e-16 2.220446e-16 9.103781e+00
[18,] 2.220446e-16 4.018005e+00 8.152666e-01
[19,] 1.001330e+00 2.220446e-16 8.583337e+00
[20,] 1.498186e+00 6.188036e+00 2.853327e+00
W矩阵分解图。
basismap(res)
4、系数矩阵H
> coef(res)
[,1] [,2] [,3] [,4] [,5]
[1,] 2.285984e-01 0.14465007 1.995241e-01 1.554168e-01 0.001258854
[2,] 2.220446e-16 0.03991706 2.220446e-16 9.745704e-02 0.138712957
[3,] 5.653353e-02 0.02613686 2.220446e-16 2.220446e-16 0.255439511
[,6] [,7] [,8]
[1,] 2.220446e-16 2.220446e-16 2.220446e-16
[2,] 1.313721e-01 2.949617e-01 2.220446e-16
[3,] 2.206748e-01 1.976229e-01 3.847068e-01
W矩阵分解图。
coefmap(res)
标签:00,01,16,2.220446,非负,矩阵,NMF,降维 来源: https://blog.csdn.net/weixin_46111814/article/details/105765321