用python实现NMF降维

article/2025/9/20 21:16:30

非负矩阵分解(Non-negative Matrix Factorization)

NMF简介

NMF用于文本降维

NMF的可解释性

NMF用于归纳单篇文章主题

NMF用于推荐多篇相似文章


NMF简介

NMF也是一种降维方法,相比PCA具有以下特点:

        1,可解释性

        2,可以用于所有数据集类型(PCA不能用于csr_matrix类型)

        3,要求样本特征必须非负,像是表示每日股票价格升降的数组就不可以

NMF用于文本降维

现在我们将NMF用在类型为csr_matrix的wiki_features上,先print一下看看它的内容:

<script.py> output:wiki_features.shape is  (60, 13125)wiki_features is  (0, 16)  0.024688249778400003(0, 32)	0.0239370711117(0, 33)	0.0210896267411:	:(59, 13107)	0.025819936285200004(59, 13108)	0.0340972474957(59, 13113)	0.0170000449408wiki_features.toarray() is  [[0.         0.         0.         ... 0.         0.         0.        ][0.         0.         0.02960744 ... 0.         0.         0.        ][0.         0.         0.         ... 0.01159441 0.         0.        ]...[0.         0.         0.         ... 0.         0.         0.        ][0.         0.00610985 0.         ... 0.         0.00547551 0.        ][0.         0.         0.         ... 0.         0.         0.        ]]

其中通过.shape可以看出原始数据有60篇文章,13125种字。.toarray()中第 i 个横向量表示第 i 篇文章中这13125种字的 "tf-idf" 值。其中,"tf" 表示每种字在第 i 篇文章中出现的频率,可以通过这种字出现的次数除以第 i 篇文章总字数计算;"idf" 是一种加权方法,可以减少频词的作用,比如冠词 "the" 。

现在我们来使用NMF给wiki_features降下维叭

# 导入相应的库
from sklearn.decomposition import NMF# 创建一个model,注意NMF必须规定降到的维数 n_components ,但是PCA不必要
model = NMF(n_components = 6)# 训练模型
model.fit(wiki_features)# 降维
nmf_features = model.transform(wiki_features)# 输出维度与内容
print(nmf_features.shape)
print(nmf_features.round(2))

最后输出结果如下,我们可以看到13125变成了6,内容的输出咱们保留了两位小数。 

<script.py> output:(60, 6)[[0.   0.   0.   0.   0.   0.44][0.   0.   0.   0.   0.   0.57][0.   0.   0.   0.   0.   0.4 ]:              :              ::              :              :[0.45 0.   0.   0.   0.01 0.  ][0.29 0.01 0.01 0.01 0.19 0.01][0.38 0.01 0.   0.1  0.01 0.  ]]

NMF的可解释性

那么这个结果是怎么得到的呢?其实是wiki_features (60, 13125) 与 model.components_转置 (13125, 6)的乘积,我们可以来验证一下~


<script.py> output:model.components_.shape is (6, 13125)(np.mat(wiki_features)*(np.mat(model.components_).I)).round(2) is  [[-0.01 -0.01 -0.   -0.02 -0.    0.44][-0.   -0.   -0.   -0.   -0.01  0.57][ 0.    0.   -0.01 -0.01 -0.    0.4 ]:                 :                 ::                 :                 :     [ 0.45 -0.   -0.   -0.02  0.01 -0.01][ 0.29  0.01  0.01  0.01  0.19  0.01][ 0.38  0.01 -0.    0.1   0.01 -0.  ]]

所以我们说NMF具有可解释性,每篇文章降维后的nmf.features是通过清晰的公式计算得到的。

咱们还可以用DataFrame格式看每篇文章降维后的特征向量,

# 导入pandas库
import pandas as pd# 创建DataFrames,用标题进行索引
df = pd.DataFrame(nmf_features,index = titles)# 输出'Anne Hathaway'文章的components
print(df.loc['Anne Hathaway'])

 输出的结果如下:

<script.py> output:0    0.0038451    0.0000002    0.0000003    0.5757114    0.0000005    0.000000Name: Anne Hathaway, dtype: float64

NMF用于归纳单篇文章主题

除了降维以外,我们还可以用NMF做很多工作,比如利用 model.components_ 归纳文章主题。比如《Anne Hathaway》在 nmf.features 保存的数据中第 3 行( 0.575711 )远大于其他几行,所以我们可以查看一下 model.components_ 的第 3 个component是什么,从而推出这篇文章的主题。

# 先创建一个方便索引model.components的表格
# 导入 pandas 库
import pandas as pd# 创建表格,model.components是(6, 13125) 的数组,很容易知道它的每一列都表示一种字
components_df = pd.DataFrame(model.components_,columns=words)# 输出看看
print(components_df)
<script.py> output:aaron     abandon    abandoned ... zone      zones     zoo0  0.011375  0.001210   0.000000  ... 0.000000  0.000424  0.01  0.000000  0.000010   0.005663  ... 0.002813  0.000297  0.02  0.000000  0.000008   0.000000  ... 0.000000  0.000143  0.03  0.004148  0.000000   0.003056  ... 0.001742  0.006720  0.04  0.000000  0.000568   0.004918  ... 0.000192  0.001351  0.05  0.000139  0.000000   0.008748  ... 0.002401  0.001682  0.0[6 rows x 13125 columns]

索引到第 3 个componets,但是我们知道一行components有13125种字,不可能全是主题,所以我们使用 .nlargest() 前五个最大值对应的字。

# 选择第三行(注意是从0开始编号)
component = components_df.iloc[3]# 输出最大的五个值对应的文字
print(component.nlargest())

最后输出的结果:

<script.py> output:film       0.627877award      0.253131starred    0.245284role       0.211451actress    0.186398Name: 3, dtype: float64

NMF用于推荐多篇相似文章

其实可以再进一步,使用 nmf_features 找出与这篇文章主题类似的其他文章,类似浏览器中的推荐功能。

直接比较 nmf_features 是不合理的,因为同一主题的文章对应的的 nmf_features 不一定相似。因为有些文章的主题表达的比较直接,有些比较隐晦(废话多),后者的主题词频可能被稀释。所以我们选择余弦相似度来比较,因为将这些同一主题的文章对应的 nmf_features 画成散点图,虽然绝对值不同,但是都近似在一条过原点的直线上,这样通过比较直线就可以比较文章主题。

示意图(以n_components = 2 为例)

下面我们来看具体的代码叭。

# 导入Pandas库
# 为了计算方便,用点积代表余弦值,可以将每一行数组化成单位向量再输入,这里调用了normalize
import pandas as pd
from sklearn.preprocessing import normalize# 矢量归一化
norm_features = normalize(nmf_features)# 创建一个表格
df = pd.DataFrame(norm_features, index = titles)# 选定一篇文章
target_article = df.loc['Anne Hathaway']# 计算这篇文章与其他文章的余弦相似度,即归一化后的点积
similarities = df.dot(target_article)# 选择相似度最大的前五篇文章
print(similarities.nlargest())

 最后输出结果:

<script.py> output:Anne Hathaway           1.000000Michael Fassbender      0.999978Catherine Zeta-Jones    0.999978Jessica Biel            0.999978Mila Kunis              0.999900dtype: float64


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

相关文章

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…

VS注释快捷键整理

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

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基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 源码精品专栏 原创 | Java 2020 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…

最新版本spring框架下载

首先spring的各种好就不说了&#xff1b;主要是最近spring将官网地址www.springsource.org改为了http://spring.io/&#xff08;新网站设计的比较舒服&#xff0c;这难道是奔商业化的节奏去的吗&#xff1f;&#xff01;&#xff09;&#xff1b;同时spring将原来比较容易找到的…

用 Java 打造一款 SSH 客户端,这个太强了。。

前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne、webssh、shellinabox等。 这些项目都可以很好地实现webssh的功能,但…