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)

在这里插入图片描述

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
非负矩阵分解(Non-negative Matrix Factorization,简称NMF)是一种常用的矩阵分解方法,它可以将一个非负矩阵分解为两个非负矩阵的乘积。NMF在数据挖掘、图像处理、文本挖掘等领域有广泛的应用。 在Matlab中,可以使用NMF工具箱来进行非负矩阵分解NMF工具箱提供了一系列函数,可以方便地进行NMF的计算和分析。 首先,你需要安装NMF工具箱。可以在Matlab的官方网站或者第三方网站上找到并下载安装。安装完成后,你可以通过以下步骤来使用NMF工具箱进行非负矩阵分解: 1. 导入数据:将你要进行NMF非负矩阵导入到Matlab中,可以使用Matlab提供的函数如`load`或者`csvread`来导入数据。 2. 调用NMF函数:使用NMF工具箱提供的函数来进行非负矩阵分解。常用的函数括`nmf`和`nnmf`。这些函数通常需要指定分解的维度、迭代次数等参数。 3. 获取分解结果:根据函数的返回值,可以获取到分解后的两个非负矩阵。这两个矩阵可以表示原始矩阵的近似或者特征。 4. 进行后续分析:根据需要,你可以对分解后的矩阵进行进一步的分析和处理。例如,可以计算重构误差、可视化分解结果等。 除了NMF工具箱,Matlab还提供了其他一些函数和工具,可以用于非负矩阵分解。例如,`nnls`函数可以用于非负最小二乘问题的求解,`nmfnnls`函数可以用于非负矩阵分解的迭代求解。 希望以上介绍对你有帮助!如果你有更多关于NMF或者Matlab的问题,请继续提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计学小王子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值