NMF通俗理解及python实现

article/2025/9/21 14:04:59

一、通俗理解概念

NMF(Non-negative matrix factorization),即对于任意给定的一个非负矩阵 V,其能够寻找到一个非负矩阵 W 和一个非负矩阵 H,满足条件 V = W × H V=W \times H V=W×H,即将一个非负的矩阵分解为左右两个非负矩阵的乘积。
V = W × H V = W \times H V=W×H
其中,

  • V矩阵中每一列代表一个观测(observation),每一行代表一个特征(feature);
  • W矩阵称为基矩阵或特征的权重矩阵,代表每个特征对聚类结果的贡献度;
  • H矩阵称为系数矩阵或样本的权重矩阵,代表每个样本对聚类结果的贡献度;
  • 此时,用系数矩阵H代替原始矩阵,就可以实现对原始矩阵进行降维,得到数据特征的降维矩阵,从而减少存储空间。

图解如下:
在这里插入图片描述

二、python实现

在sklearn封装了NMF的实现,但是注意sklearn中输入数据的格式是(samples, features)

from sklearn.decomposition import NMF
from sklearn.datasets import load_irisX, _ = load_iris(True)# can be used for example for dimensionality reduction, source separation or topic extraction
# 个人认为最重要的参数是n_components、alpha、l1_ratio、solver
nmf = NMF(n_components=2,  # k value,默认会保留全部特征init=None,  # W H 的初始化方法,包括'random' | 'nndsvd'(默认) |  'nndsvda' | 'nndsvdar' | 'custom'.solver='cd',  # 'cd' | 'mu'beta_loss='frobenius',  # {'frobenius', 'kullback-leibler', 'itakura-saito'},一般默认就好tol=1e-4,  # 停止迭代的极限条件max_iter=200,  # 最大迭代次数random_state=None,alpha=0.,  # 正则化参数l1_ratio=0.,  # 正则化参数verbose=0,  # 冗长模式shuffle=False  # 针对"cd solver")# -----------------函数------------------------
print('params:', nmf.get_params())  # 获取构造函数参数的值,也可以nmf.attr得到,所以下面我会省略这些属性# 下面四个函数很简单,也最核心,例子中见
nmf.fit(X)
W = nmf.fit_transform(X)
W = nmf.transform(X)
nmf.inverse_transform(W)
# -----------------属性------------------------
H = nmf.components_  # H矩阵
print('reconstruction_err_', nmf.reconstruction_err_)  # 损失函数值
print('n_iter_', nmf.n_iter_)  # 实际迭代次数

注意点:

  • init参数中,nndsvd(默认)更适用于sparse factorization,其变体则适用于dense factorization.
  • solver参数中,如果初始化中产生很多零值,Multiplicative Update (mu) 不能很好更新。所以mu一般不和nndsvd使用,而和其变体nndsvda、nndsvdar使用。
  • solver参数中,cd只能优化Frobenius norm函数;而mu可以更新所有损失函数
图像特征提取

这里再举一个NMF在图像特征提取的应用,来自官方示例,根据我的需要改动了一些:

from time import time
from numpy.random import RandomState
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decompositionn_row, n_col = 2, 3
n_components = n_row * n_col
image_shape = (64, 64)
rng = RandomState(0)# #############################################################################
# Load faces data
dataset = fetch_olivetti_faces('./', True,random_state=rng)
faces = dataset.datan_samples, n_features = faces.shapeprint("Dataset consists of %d faces, features is %s" % (n_samples, n_features))def plot_gallery(title, images, n_col=n_col, n_row=n_row, cmap=plt.cm.gray):plt.figure(figsize=(2. * n_col, 2.26 * n_row))plt.suptitle(title, size=16)for i, comp in enumerate(images):plt.subplot(n_row, n_col, i + 1)vmax = max(comp.max(), -comp.min())plt.imshow(comp.reshape(image_shape), cmap=cmap,interpolation='nearest',vmin=-vmax, vmax=vmax)plt.xticks(())plt.yticks(())plt.subplots_adjust(0.01, 0.05, 0.99, 0.93, 0.04, 0.)# #############################################################################
estimators = [('Non-negative components - NMF',decomposition.NMF(n_components=n_components, init='nndsvda', tol=5e-3))
]# #############################################################################
# Plot a sample of the input dataplot_gallery("First centered Olivetti faces", faces[:n_components])# #############################################################################
# Do the estimation and plot itfor name, estimator in estimators:print("Extracting the top %d %s..." % (n_components, name))t0 = time()data = facesestimator.fit(data)train_time = (time() - t0)print("done in %0.3fs" % train_time)components_ = estimator.components_print('components_:', components_.shape, '\n**\n', components_)plot_gallery('%s - Train time %.1fs' % (name, train_time),components_)
plt.show()#---------------------------其他注释---------------------------
V矩阵:400*4096
W矩阵:400*6
H矩阵:6*4096

http://chatgpt.dhexx.cn/article/ettnZJE6.shtml

相关文章

NMF-CC

题目:Multi-view clustering by non-negative matrix factorization with co-orthogonal constraints 一、创新点 和其他使用NMF的方法一样,这篇文章也是加约束,使创造出来的representation matrices更好。这篇文章加的约束叫做co-orthogon…

用python实现NMF降维

非负矩阵分解(Non-negative Matrix Factorization) NMF简介 NMF用于文本降维 NMF的可解释性 NMF用于归纳单篇文章主题 NMF用于推荐多篇相似文章 NMF简介 NMF也是一种降维方法,相比PCA具有以下特点: 1,可解释性 2,可以用于所…

nmf java_NMF pLSA

今天在围脖中看到自动化所刘康的围脖中给了一个关于NMF和pLSA对比分析的链接http://ezcodesample.com/plsaidiots/NMFPLSA.html,大体读了一下,下面用中文对文中的思想重新解释,版权归原作者Andrew Polar。 一、名词解释 (1)NMF, nonnegative …

nmf java_NMF的算法原理

NMF(Non-negative matrix factorization,非负矩阵分解),即对于任意给定的一个非负矩阵V,其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件VW*H,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。其中,V矩阵中每一…

NMF降维的本质,NMF和PCA的区别

一、NMF的本质 1.当数据完全一样时 # 将如下数据的行向量用NMF降到3维,初始化策略全部用nndsvd,不能用random,下同 Xnp.array([[5,5,5,5],[5,5,5,5],[5,5,5,5],[5,5,5,5]])结果是这样的: 2.当数据分布全部递增时 # 原数据 Xn…

非负矩阵分解NMF简介

本文整理NMF相关知识。 简介 非负矩阵分解(Nonnegative Matrix Factorization),简称NMF,是由Lee和Seung于1999年在自然杂志上提出的一种矩阵分解方法,它使分解后的所有分量均为非负值(要求纯加性的描述),并且同时实现非线性的维数…

NMF

计算机是人类解决难题、探索未知以及提供娱乐的绝佳工具。在高效运行着的各种计算机应用背后,融汇了人类在物理、电子和数学等多门学科的高超智慧。严密的数学使得计算机能高效执行人类指令,控制内部各种数据流的走向,因此在现代计算机科学研…

无监督学习——非负矩阵分解(NMF)

序 非负矩阵分解(NMF)是一种无监督学习算法,其目的在于提取有用的特征。它的工作原理类似于PCA,也可以用于降维。与PCA相同,我们试图将每个数据点写成一些分量的加权求和。但在PCA中,我们想要的是正负分量…

非负矩阵分解NMF

http://blog.csdn.net/pipisorry/article/details/52098864 非负矩阵分解(NMF,Non-negative matrix factorization) NMF的发展及原理 著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果。该文提出了一种新的矩阵分解思想—…

非负矩阵分解(NMF)的Matlab实例与说明

原理啥的到处都有,就直接跳过了。这里主要是NMF的基础实验。下一篇是NMF的高光谱实验总结。 1. matlab示例解说 这一节的图片来自官方文档。 这里第一和第三变量在第一行的值0.6945和0.62220对W的第一列有相当强的权重。第一个第二变量在第二行的值0.8020和0.568…

【机器学习】NMF(非负矩阵分解)

写在篇前 本篇文章主要介绍NMF算法原理以及使用sklearn中的封装方法实现该算法,最重要的是理解要NMF矩阵分解的实际意义,将其运用到自己的数据分析中! 理论概述 NMF(Non-negative matrix factorization),即对于任意给定的一个非负…

vs快捷键与vs自定义快捷键

文章目录 :star: 主题:VS快捷键1.常用的默认快捷键2.自定义快捷键2.1 添加快捷键2.2 移除快捷键2.3 重置快捷键,恢复默认 :bookmark: 小结 ⭐️ 主题:VS快捷键 📍 来自:中南林业科技大学软件协会学术部:谢…

vs注释与反注释快捷键

使用VS C语言编译器的快捷注释按键: 选中部分注释: Ctrl KD (按住Ctrl然后先按K再按D) 注释前: 注释后: 反注释: Ctrl KU (按住Ctrl然后先按K再按U) 操作完就恢复了…

VS(visual studio)注释快捷键及自定义设置

注释: CtrlKC 取消注释: CtrlKU 【工具】→【选项】→【环境】→【键盘】→【搜索注释】 点击【编辑.注释选定内容】→【移除】 输入快捷键,点击【分配】→【确定】 取消注释的自定义快捷键同理设置即可,注释和取消注释不…

Visual Studio Code2022无法使用注释快捷键

用了一个月vscode,使用ctrl/发现注释始终无法使用,最开始一直以为是系统或者版本问题,因为之前机器做过一次修改机器码的操作。 今天尝试解决了一下,发现问题可以通过键盘映射方案进行解决 文件->账户设置或者右上角头像图标 搜…

vs2019注释快捷键设置

vs2019默认的注释快捷键为ctrl+k+c 取消注释快捷键为ctrl+k+u 我们也可以自己设置 当然,也可以设置自己习惯的快捷键

VS中的设置和快捷键

一.相关设置 1.设置主题颜色 【工具】-》【选项】-》【常规】,选择主题颜色为浅色,点击确定。 2.设置背景颜色 【工具】-》【选项】-》【字体和颜色】,项背景颜色那里,点击自定义。 HSB(HSL)&#xff1a…

VS注释快捷键整理

在 Visual Studio IDE 中使用快捷键注释代码,无论是行注释还是块注释,第一步一定是选中要注释的内容(取消注释同样要先选中)! 当然,如果是行注释,不必选取整行,将光标定位到该行即可…

javassh客户端_简单的Java SSH客户端

javassh客户端 可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello = new Shell.Plain(new SSH("ssh.example.com", 22,"yegor", "-----BEGIN RSA PRIVATE KEY-----...") ).exec("echo Hello, world!"); jca…

Java打造一款SSH客户端,而且已开源

点击上方“Java基基”,选择“设为星标” 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…