NMF降维算法与聚类模型的综合运用

article/2025/9/21 13:19:10

NMF降维算法与聚类模型的综合运用

    • 前言
    • 一:NMF算法
    • 二:NMF算法的使用
    • 三:NMF算法与层次聚类的综合使用
    • 四:总结

前言

这一章,我们讨论下另一个比较有效的降维手段:NMF(非负矩阵分解)。NMF降维理论的创建相比于经典的降维理论,略显“年轻”。我们接下来将详细介绍下NMF的原理以及在生产实践中的运算,结合代码和可视化图像来说明这些。

岁月如云,匪我思存,写作不易,望路过的朋友们点赞收藏加关注哈,在此表示感谢!

一:NMF算法

NMF又叫非负矩阵分解,为什么是“非负”?因为非负数据往往在实际中才是有意义的数据。 NMF本质上说是一种矩阵分解的方法,它的特点是可以将一个大的非负矩阵分解为两个小的非负矩阵,又因为分解后的矩阵也是非负的,所以也可以继续分解。因此,当我们数据集大小过于庞大时,NMF算法可以运用解决数据庞大而带来的复杂超额的计算量

  • 底层原理解释

1:简单概括

我们设数据 D = m ∗ n D=m∗n D=mn其中 m m m 是数据的个数, n n n 是数据特征。当矩阵 D D D 非负时,我们令 D ( m ∗ n ) = W ( m ∗ k ) ∗ H ( k ∗ n ) D_{(m∗n)}=W_{(m∗k)}∗H_{(k∗n) } D(mn)=W(mk)H(kn) (由代数知识知此解不会唯一,但每个解都是相应变换关系,含有的信息是相似的),其中 k k k 为从矩阵 D D D 中抽取的特征个数,则矩阵 W W W 为包含 k k k 个特征的基数据矩阵,也就是降维后的目标矩阵, H H H 为对应的系数矩阵,
在这里插入图片描述

上图图1可以很形象的说明分解过程,其中s.t.意思为矩阵W、H的每个元素必须是>=0。

2:常见两种代价函数(损失函数)

矩阵 W W W 和矩阵 H H H 的求解也是近似解,为了寻找最优的 W W W H H H,我们要求欧式距离代价函数最小,即

m i n ‖ D − D ′ ‖ 2 = m i n ∑ i , j ( D i j − D i j ′ ) 2 min‖D-D^′ ‖^2=min∑_{i,j}(D_{ij}-D_{ij}^′ )^2 minDD2=mini,j(DijDij)2其中 D ′ = W ∗ H D^′=W∗H D=WH

K L KL KL 散度也是一种代价函数。 KL 简单一句话概括就是两个概率分布之间的差异性度量,在计算中,一个概率分布为真实分布,另一个为理论(拟合)分布, K L KL KL 散度表示使用理论分布拟合真实分布时产生的信息损耗的期望值,我们用公式表示如下:
D K L ( p ∣ ∣ q ) = E [ l o g 2 p ( x ) − l o g 2 ( q ( x ) ) ] D_{KL}(p||q)=E[log_2p(x)-log_2(q(x))] DKL(pq)=E[log2p(x)log2(q(x))]

那么对应的离散形式可以表示为 :
D K L ( p ∣ ∣ q ) = ∑ i = 1 N p ( x i ) ( l o g 2 p ( x i ) − l o g 2 q ( x i ) ) D_{KL}(p||q)=\sum_{i=1}^{N}{p(x_i)}(log_2p(x_i)-log_2q(x_i)) DKL(pq)=i=1Np(xi)(log2p(xi)log2q(xi))

对应的连续形式可以表示为:
D K L ( p ∣ ∣ q ) = ∫ − ∞ + ∞ p ( x ) ( l o g 2 p ( x ) − l o g 2 q ( x ) ) d x D_{KL}(p||q)=\int_{-\infty}^{+\infty}p(x)(log_2p(x)-log_2q(x))dx DKL(pq)=+p(x)(log2p(x)log2q(x))dx

这里的 p ( x i ) , q ( x i ) p(x_i),q(x_i) p(xi),q(xi) 就是表示真实和理论上的每个随机变量的概率值。在进行NMF损失函数构建中,我们同样要求存在 D ′ D^{'} D使得

m i n D K L ( D ∣ ∣ D ′ ) = m i n ∑ i j [ D i j l o g 2 D i j D i j ′ − D i j + D i j ′ ] minD_{KL}(D||D^{'})=min\sum_{ij}\left[ {D_{ij}log_2\frac{D_{ij}}{D_{ij}^{'}}-D_{ij}+D_{ij}^{'}} \right] minDKL(DD)=minij[Dijlog2DijDijDij+Dij] 存在。

3:参数的迭代优化

为保证矩阵的各个元素在非负状态下计算,针对上述两种代价函数,我们基于梯度下降方法设以下两种迭代公式(至于这两种迭代公式怎么来的,通过上述建立的损失函数再对各变量求偏导即可)

基于欧式距离的迭代公式:

H α j k + 1 = H α j k ( ( W k ) T D ) α j ( ( W k ) T ( D ′ ) k ) α j 和 W i α k + 1 = W i α k ( D ( H k ) T ) i α ( ( D ′ ) k ( H k ) T ) i α H_{\alpha j}^{k+1}=H_{\alpha j}^k\frac{\left( (W^k)^TD\right)_{\alpha j}}{\left( (W^k)^T(D^{'})^k\right)_{\alpha j}} 和 W_{i\alpha}^{k+1}=W_{i\alpha}^k\frac{\left( D(H^k)^T \right)_{i\alpha}}{\left( (D^{'})^k(H^k)^T\right)_{i\alpha}} Hαjk+1=Hαjk((Wk)T(D)k)αj((Wk)TD)αjWiαk+1=Wiαk((D)k(Hk)T)iα(D(Hk)T)iα

基于 K L KL KL 散度迭代公式:

H α j k + 1 = H α j k ∑ i [ W i α k D i j / ( D ′ ) i j ] ∑ i W i α H_{\alpha j}^{k+1}=H_{\alpha j}^k\frac{\sum_{i}{\left[ W_{i\alpha}^{k}D_{ij}/(D^{'})_{ij} \right]}}{\sum_{i}{W_{i\alpha}}} Hαjk+1=HαjkiWiαi[WiαkDij/(D)ij]

W i α k + 1 = W i α k ∑ j [ H α j k D i j / ( D ′ ) i j ] ∑ j H α j 。 W_{i\alpha}^{k+1}=W_{i\alpha}^k\frac{\sum_{j}{\left[ H_{\alpha j}^{k}D_{ij}/(D^{'})_{ij} \right]}}{\sum_{j}{H_{\alpha j}}}。 Wiαk+1=WiαkjHαjj[HαjkDij/(D)ij]

特别注意这里各个上标下标字母含义与计算过程。

在迭代过程中,我们设定好最大迭代次数或者代价函数的下界值为迭代终止条件。其中关于参数迭代能否收敛下去,有兴趣的朋友可以参考相关证明文献。以上就是整个NMF算法的底层原理介绍

二:NMF算法的使用

  • NMF在实际降维中充当何种身份

在图像识别方面,NMF可以非常有效的压缩原始高维特征数据。为了更加形象描述NMF原理,我们举一个人脸例子。人脸包括“嘴巴、鼻子、眼睛、眉毛等等”,这时候我们只提取一些重要特征如“嘴巴、鼻子”等一些特殊信息,那么用这些独立部位信息的加权组合即可构成人的一张脸,公式 H ∗ W = H ∗ [ W 1 , W 2 , … W n ] H∗W=H∗[W_1,W_2,…W_n] HW=H[W1,W2,Wn] 可以非常好的概括这一过程。而传统的PCA等只是对整个一张脸去除相似特征进行模糊处理而已

在生物信息方面,由于NMF是分解不出来负数值的,所以对于生物上的数据,对于高蛋白质维度的数据降维,NMF是个很好的方法,可以很好的选择最有效的蛋白特征数据。

在语音识别方面,NMF算法成功实现了有效的语音特征提取,并且由于NMF算法的快速性,对实现机器的实时语音识别有着促进意义。

  • NMF的算法调用

我们直接调用函数,并参考官方文档给的参数解释如下

from sklearn.decomposition import NMF
nmf = NMF(n_components=2,init=None,  # W H 的初始化方法, 默认'nndsvd',还有'random','nndsvda','nndsvdar','custom'.solver='cd',  # 'cd','mu'beta_loss='frobenius',  # 还有'kullback-leibler', 'itakura-saito',此时的solver=‘mu’tol=1e-6,  # 停止迭代的误差下界值max_iter=500,  # 最大迭代次数random_state=None,alpha=0.,  # 正则化参数l1_ratio=0.,  # 正则化参数verbose=0,  # 冗长模式,类似于神经网络是否打印迭代过程shuffle=False  # 针对'cd solver')##常见函数打印如下:
print('params:', nmf.get_params())  # 获取构造函数参数的值nmf_model = NMF(n_components=4,verbose=1) #训练模型
W = nmf.fit_transform(X) #W矩阵
H = nmf.components_  # H矩阵
print('error_value', nmf.reconstruction_err_)  # 损失函数值
print('n_iter_', nmf.n_iter_)  # 实际迭代次数

三:NMF算法与层次聚类的综合使用

接下来,我们主要讨论NMF如何跟聚类算法综合使用来处理实际问题。NMF是一种有效降维手段,层次聚类是一种两空间点基于特定距离运算的自下而上的不断从小聚类簇合并成大聚类簇的聚类算法,算法理解比较直观,但运算量比较大。我们会结合层次系谱图和聚类热图来确定聚类数目和相应的聚类样本簇(这里有兴趣可以对比之前文章所介绍肘方法、CH值或者轮廓系数所确定的聚类数目)。可以参考本人之前的论文!

Heatmap中文称为热点图,热点图是通过使用不同的标志将图或页面上的区域按照受关注程度(分布数据大小)的不同加以标注并呈现的一种分析手段,标注的手段一般采用颜色的深浅、点的疏密以及呈现比重的形式。

  • 实验代码编写

导入相关的模块和数据集信息,此次数据大小为(900,800)

from sklearn.decomposition import NMF
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pdplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedata = pd.read_csv(r'NMF与HC建模数据.csv',index_col=0,encoding='gbk')

NMF方法建立

d = 3##降维维度
nmf_model = NMF(n_components=d,random_state=11,alpha=2,solver='mu',beta_loss='kullback-leibler')##NMF方法相关参数
a_nmf = nmf_model.fit_transform(data_orginal)##W
b_nmf = nmf_model.components_##H

由于我们是根据系谱图和热图分布才能知晓聚成几类比较好,所以我们要先得到聚类后的重排序样本数据

根据重排序的样本数据和聚类数目,我们最终绘制热图

def makeheatmap(data,msg):_c = dict(zip(data.loc['cluster'].unique(), ['red', 'blue', 'orange']))_c_color = data.loc['cluster'].map(_c)heatmapdf = data.iloc[2:,:].astype(float)res_hm = sns.clustermap(heatmapdf,figsize=(15, 8),pivot_kws=None, method='average', metric='euclidean',dendrogram_ratio=0.1, colors_ratio=0.03,cbar_pos=(0.05, 0.1, 0.01, 0.5),tree_kws=None,# annot=True,  # 默认为False,当为True时,在每个格子写入data中数据# annot_kws={'size': 12, 'weight': 'normal', 'color': 'red'},# 设置格子中文本的大小、粗细、颜色cmap=sns.color_palette('RdBu_r', 21),##热图颜色row_cluster=False,  # 行方向不聚类col_cluster=True,  # 列方向聚类vmin=-1, vmax=1,col_colors=_c_color,# yticklabels = data.columns,# xticklabels = data.index,)legend_TN = [mpatches.Patch(color=c, label=l) for c, l in data.T[['color', 'cluster']].drop_duplicates().values]res_hm.ax_heatmap.legend(loc='center left', bbox_to_anchor=(1, 0.5), handles=legend_TN)plt.title(msg,fontsize=10)plt.show()
msg = '特征降至%s维后的热图分布'%d
makeheatmap(res_grdf,msg)

在这里插入图片描述

图1

从上图图1中,我们发现热图是存在明显的3块高表达区域,再结合层次系谱图,我们做出三种颜色的聚类线条。综上,在这些方法下,此数据聚成3类是比较合适

四:总结

  • NMF结合相关聚类技术,是一种非常有效的综合聚类模型,当然,聚类方法很多(如之前我们底层编写的Kmean++),确定聚类数目方法很多(肘方法、轮廓系数、CH值等等),此文中的热图也是一种有效的确定聚类数目方法,更甚至降维技术也很多,如上篇的Kpca、Tsne等,都可以用于实际生产中解决问题
  • NMF的作用远远不仅于此,比如当我们涉及的数据大小过于庞大,直接把数据带入模型计算瞬间会消耗大量资源,但我们还要保持所有数据信息完整(不能进行特征提取或者降维处理),这时候我们也可以使用NMF算法,对庞大数据(数据先保证为非负)拆分然后根据矩阵运算规则进行切块计算,这样会避免瞬间过多消耗计算机资源

在这里插入图片描述


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

相关文章

NMF(非负矩阵分解)分子分型

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> Non-Negative Matrix Factorization (NMF). Find two non-negative matrices, i.e. matrices with all non-negative elements, (W, H) whose product approximates the non-negative matrix X. This factorization c…

LSA、pLSA、LDA、NMF、BERTopic、Top2Vec进行主题建模

在自然语言处理(NLP)中,主题建模是一种技术,用于从文本数据中发现隐藏的语义主题(或主题)。这是一个无监督机器学习问题,即在没有标签或标签的情况下学习模式。主题建模的应用非常广泛,可用于搜索引擎、情感分析、新闻聚类和摘要生成等许多任务。 在这里将探讨主题建模…

NMF通俗理解及python实现

一、通俗理解概念 NMF(Non-negative matrix factorization)&#xff0c;即对于任意给定的一个非负矩阵 V&#xff0c;其能够寻找到一个非负矩阵 W 和一个非负矩阵 H&#xff0c;满足条件 V W H VW \times H VWH&#xff0c;即将一个非负的矩阵分解为左右两个非负矩阵的乘积…

NMF-CC

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

用python实现NMF降维

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

nmf java_NMF pLSA

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

nmf java_NMF的算法原理

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

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

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

非负矩阵分解NMF简介

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

NMF

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

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

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

非负矩阵分解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实例与说明

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

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

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

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

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

vs注释与反注释快捷键

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

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

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

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

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

vs2019注释快捷键设置

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

VS中的设置和快捷键

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