热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

非负矩阵分解(NMF)简介

作者:StarkEinstein链接:https:zhuanlan.zhihu.comp22043930来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。什么是非
作者:Stark Einstein
链接:https://zhuanlan.zhihu.com/p/22043930
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

什么是非负矩阵分解?

非负矩阵分解,顾名思义就是,将非负的大矩阵分解成两个非负的小矩阵。

V\approx WH (1)

回顾矩阵分解本身,在R^{n} 空间分布的一堆数据有它们分布的某些规律,那么找一组更能直观反映这种规律的基,再把原来的数据投影到这组基上表示,这样就能便于后续的应用,比如分类等。

公式(1)中的V是一个n*m维的矩阵,其中每一列就是R^{n} 空间中的一个向量,共m个向量;W是一个n*k维的矩阵,即k个基;H是k*m的矩阵,每一列为V投影到W上得到的向量。

那么非负和其它的有什么不同呢?下面我就盗一张图来直观地展示几种矩阵分解方法的效果差异。(出自Lee and Seung (1999)

其中original原图即为V中的一列;等式左边第一块是W,其中的每一小块是W的一列;等式左边第二块是H的一列;等式右边的图像是左边相乘还原得到的与original相对应的一个向量(只不过显示成二维图像)。

图中就对比了三种方法的区别。

VQ的约束是要求H的每一列只有一个元素为1,其它为0,因此相当于将m个数据归纳成了k个代表,原数据映射过去就是取k个基当中与原向量距离最小的来重新表示。所以VQ的基都是一张张完整正常的脸,它们都是最具代表性的脸。

PCA大家用得比较多,就是求一组标准正交基,第一个基的方向取原数据方差最大的方向,然后第二个基在与第一个基正交的所有方向里再取方差最大的,这样在跟前面的基都正交的方向上一直取到k个基。所以PCA的基没有直观的物理意义,而且W和H里面的元素都是可正可负的,这就意味着还原时是用W的基加加减减得到的。

NMF因为约束了非负,所以只准把基相加,不能相减,这就意味着基与基是通过拼接组合来还原原象的。所以我们可以看到NMF的每个基实际上在表示着脸部的某个部件,这种性质在许多场景上就有了它特有的用处了。



我们换个角度来想像一下这三种情景。

VQ其实就像kmeans,它的基都落在原数据的最具代表性的位置上。

PCA的基则是指向四向八方的,相互正交着。

NMF的原数据首先就是只分布在非负子空间里面的,然后它的基则在这个非负子空间靠近边缘的区域,像一组长短不一、间隔不一的伞骨。




怎么分解?

这是个有界优化问题

所以最直观的最简单的方法就是

方法一

嗯,真是简单到几行代码就搞定了,而且跟原问题保持一致。

我们看标准的有界优化问题

标准的解法

所以我们方法一是按套路出牌的。



但是,作为有追求有理想的同学们,Lee and Seung (1999)认为方法一不够好,要来点更快的。

方法二

这个又叫乘法更新法,因为人家用了乘法......

推导起来有点麻烦,但写起代码来也是相当简单,几行代码足矣,而且收敛比方法一快一些。



但是,作为有追求有理想的同学们,林智仁(没错,就是搞libsvm那个林智仁)C Lin(2007)摇摇头,“看我的”。

方法三

传说中这个方法是快了一些,然而我觉得有方法一和二就妥妥了,像现在这么强计算力的时代,计算省下来那点时间,还抵不回写这复杂代码多花的时间。

林智仁这篇文章C Lin(2007)是后期出来的,review了之前几种主流的方法,再提出自己的新方法,所以这篇的内容比较全(懒人只看这一篇就够了)。


推荐阅读
  • vmware workstation14嵌套安装kvm
    vmware workstation14嵌套安装kvm ... [详细]
  • 724. 寻找数组的中轴索引
    给定一个整数数组 `nums`,编写一个方法返回该数组的“中轴”索引。定义中轴索引为该索引左侧所有数字之和等于右侧所有数字之和的索引。如果不存在这样的索引,则返回 -1。如果有多个中轴索引,返回最左边的一个。 ... [详细]
  • 深入解析BookKeeper的设计与应用场景
    本文介绍了由Yahoo在2009年开发并于2011年开源的BookKeeper技术。BookKeeper是一种高效且可靠的日志流存储解决方案,广泛应用于需要高性能和强数据持久性的场景。 ... [详细]
  • 本文介绍了如何通过ARM编译器组件重定向标准C运行时库的I/O函数,以适应不同的硬件平台。原文链接:https://www.keil.com/pack/doc/compiler/RetargetIO/html/retarget_overview.html ... [详细]
  • 解决vCenter vSphere HA初始化失败的问题
    本文探讨了在集群中遇到的所有vSphere HA主机状态显示‘无法正确安装或配置vSphere HA代理’错误的情况,并详细介绍了排查与解决步骤,包括检查HA初始化错误及安装HA代理的常见故障排除方法。 ... [详细]
  • matlab gamma函数_MATLAB做晶体结构图(固体物理)
    写在前面最近在复习考研复试《固体物理》这一门课,去年学的内容已经忘干净了,所以就翻开前几页。突然看到了面心立方和体心立方结构图,想到了去年 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • 本改进旨在提升运行选择器中名称换行的显示效果,以提高用户体验。 ... [详细]
  • 这是我在复习时整理的笔记,过一遍就稳了,建议还是把PPT过一遍,老师考的都是基础题,大部分都在PPT上,特别是 ... [详细]
  • 本文详细记录了一位具有五年半开发经验的候选人,在华为Android高级开发职位面试过程中的经历。从早晨9点到下午5点半,经过了群体面试、技术面试、综合面试及英语面试等多个环节,最终成功通过考核。文章不仅分享了面试心得,还提供了宝贵的面试题资源。 ... [详细]
  • iOS 开发技巧:TabBarController 自定义与本地通知设置
    本文介绍了如何在 iOS 中自定义 TabBarController 的背景颜色和选中项的颜色,以及如何使用本地通知设置应用程序图标上的提醒个数。通过这些技巧,可以提升应用的用户体验。 ... [详细]
  • 不同方式实现集群的可行性 && 部分不建议踩的坑
    路标1.Systemhasnotbeenbootedwithsystemdasinitsystem(PID1).Can’toperate.2.CannotconnecttotheD ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
author-avatar
我是王瑀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有