非负矩阵分解(NMF)是一种无监督学习算法,目的在于提取有用的特征(可以识别出组合成数据的原始分量),也可以用于降维,通常不用于对数据进行重建或者编码。
与PCA相同,NMF将每个数据点写成一些分量的加权求和,并且分量和系数都大于0,只能适用于每个特征都是非负的数据(正负号实际上是任意的)。

两个分量的NMF:分量指向边界,所有的数据点都可以写成这两个分量的正数组合。
一个分量的NMF:分量指向平均值,指向这里可以对数据做出最好的解释。
在NMF中,不存在“第一非负分量”,所有分量地位平等,减少分量个数会删除一些方向。NMF使用了随机初始化,根据随机种子的不同可能会产生不同的结果。

将NMF应用于人脸图像特征提取(wild数据集)

from sklearn.decomposition import NMF
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_lfw_people
import matplotlib.pyplot as plt
import numpy as np# 数据集处理
people = fetch_lfw_people(min_faces_per_person=20, resize=0.7)
image_shape = people.images[0].shape # 图片像素值
mask = np.zeros(people.target.shape, dtype=np.bool)
for target in np.unique(people.target):mask[np.where(people.target == target)[0][:50]] = 1
x_people = people.data[mask]
y_people = people.target[mask]
x_people= x_people / 255
x_train, x_test, y_train, y_test = train_test_split(x_people, y_people, random_state=0)# 提取特征
nmf = NMF(n_components=15, random_state=0).fit(x_train)
x_train_nmf = nmf.transform(x_train)
x_test_nmf = nmf.transform(x_test)# 展示提取的不同分量
fix, axes = plt.subplots(3, 5, figsize=(15, 12), subplot_kw={'xticks':(), 'yticks':()})
for i,(component, ax) in enumerate(zip(nmf.components_, axes.ravel())):ax.imshow(component.reshape(image_shape))ax.set_title("{} component".format(i))

NMF的主要参数(n_components参数):想要提取的分量个数。这个数字通常要小于输入特征的个数(否则将每个像素作为单独的分量就可以解释数据)。

根据提取到的特征排序

# 用第三个分量排序,显示稍微向右转的人脸
compn = 3
inds = np.argsort(x_train_nmf[:, compn])[::-1]
fig, axes = plt.subplots(2, 5, figsize=(15,8), subplot_kw={'xticks':(), 'yticks':()})
for i,(ind, ax) in enumerate(zip(inds, axes.ravel())):ax.imshow(x_train[ind].reshape(image_shape))

argsort()函数:将数组按照从小到大的顺序排序,并并返回排序后的下标。当axis=0时,按列排列;当axis=1时,按行排列;如果省略默认按行排列。
a[::-1] 方法:取从后向前(相反)的元素。

np.argsort函数
Python中numpy数组切片:print(a[0::2])、a[::2]、[:,2]、[1:,-1:]、a[::-1]、[ : n]、[m : ]、[-1]、[:-1]、[1:]等的含义(详细)

将MNF应用于还原混合信号

NMF提取模式,适合于具有叠加结构的数据,包括音频,基因表达和文本数据。

# 一个三种信号源合成的信号
s = mglearn.datasets.make_signals()
print(s.shape) # (2000, 3)# 将数据混合成100维
a = np.random.RandomState(0).uniform(size=(100, 3))
x = np.dot(s, a.T)
print(x.shape) # (2000, 100)# 用NMF还原三个信号
nmf = NMF(n_components=3, random_state=42)
s_ = nmf.fit_transform(x)
print(s_.shape) # (2000, 3)# 绘图
models = [x, s, s_ ]
names = ['Mixed', 'Sources', 'NMF recover'] # 混合信号,原始信号,NMF还原信号
fig, axes = plt.subplots(3, figsize=(8, 6), gridspec_kw={'hspace': .5}, subplot_kw={'xticks':(), 'yticks':()})
for model, name, ax in zip(models, names, axes):ax.set_title(name)ax.plot(model[:, :3],'-')

numpy.random.RandomState()函数:获得随机数生成器。只要随机数种子seed相同,产生的随机数系列就相同。
dot()函数:返回两个数组的点积。A.T是矩阵的转置。
fit_transform()函数:fit和transform的组合,既包括了训练又包含了转换。
gridspec_kw参数:字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建子图。应该是调整子图位置的。

Matplotlib 中文用户指南 3.3 使用 GridSpec 自定义子图位置
numpy.random.RandomState() numpy里random总结
对NumPy中dot()函数的理解
fit_transform,fit,transform区别和作用


NMF生成的分量是没有顺序的,如果分量顺序和原始信号完全相同(线的颜色)只是偶然。

【机器学习】(十七)非负矩阵分解NMF:人脸图像特征提取、用特征排序;还原混合信号相关推荐

  1. 非负矩阵分解提取人脸特征

    非负矩阵分解原理 顾名思义:是一个矩阵分解,并且分解矩阵非负.看起来这句话给人的信息量不大,背后却能挖掘NMF为什么会被提出且广泛被运用的原因. 首先是NMF是一个矩阵分解,它和PCA(主成分分析). ...

  2. 文本主题模型之非负矩阵分解(NMF)

    1. 非负矩阵分解(NMF)概述 非负矩阵分解(non-negative matrix factorization,以下简称NMF)是一种非常常用的矩阵分解方法,它可以适用于很多领域,比如图像特征识别 ...

  3. Python人脸图像特征提取(HOG、Dlib、CNN方法)

    Python人脸图像特征提取(HOG.Dlib.CNN方法) 一.HOG人脸图像特征提取 1.HOG特征: 1) 主要思想: 2) 实现方法: 3) 性能提高: 4) 优点 2.HOG特征提取算法的实 ...

  4. 非负矩阵分解NMF(1): 非调包python实现

    文章目录 1. 矩阵分解(Matrix Factorization): 1.1 公式推导 1.2 代码实现 1.3 在图像数据下的效果 2. 非负矩阵分解(Non-negative Matrix Fa ...

  5. 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制

    PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了.下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维. 把原始数据中每个样本用一个向量表示,然后把所 ...

  6. 详解非负矩阵分解(NMF)及其在脑科学中的应用

    非负矩阵分解及其在脑科学中的应用 基本原理 确定最优因子数量 代码实现 非负矩阵分解与主成分分析的区别 非负矩阵分解在脑科学中的应用 应用一:神经发育模式:T2w/T1w比值映射的非负矩阵分解(NMF ...

  7. 人脸图像特征提取的各种方法、笑脸识别及口罩识别

    人脸图像特征提取的各种方法.笑脸识别及口罩识别 一.人脸图像特征提取的各种方法 (一)HOG 1.HOG定义 2.HOG提取的图像信息 3.HOG算法的基本流程 (二)Dlib (三)卷积神经网络特征 ...

  8. 推荐算法——非负矩阵分解(NMF)

    1. 矩阵分解回顾 在博文推荐算法--基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分.矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品矩阵 ...

  9. 机器学习:非负矩阵分解(NMF)

最新文章

  1. 【问题收录】ImportError No module named MySQLdb 问题解决
  2. 队列判空_数据结构与算法——队列的C语言实现
  3. php 循环写入 缓冲,php利用缓冲实现动态输出(flush,ob_flush)
  4. php range第二个参数比第一个小,鲜为人知的 PHP range() 函数
  5. 图像的zoomfft变换
  6. 使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接
  7. java服务器端测试_java-在服务器端测试Spring Web Services端点?
  8. C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
  9. python输出隔4个字符_python怎么实现每隔几个字符分割
  10. SQL to ElasticSearch DSL改进
  11. Ubuntu用Apache2快速搭建一个HTTP文件服务器
  12. 概念梳理:C++中iostream头文件和命名空间的基础介绍和拓展内容
  13. SQL学习笔记(06)_SELECT INTO
  14. 浏览器https证书存在错误怎么办?
  15. HEVC: I帧、P帧及B帧
  16. 固态硬盘与机械硬盘数据迁移
  17. 测试学习小结:测试的7种分类
  18. WEB端显示三维地形模型
  19. OpenCV学习笔记-傅里叶变换
  20. 计算机我们一起学猫叫谱子,一起喵喵喵喵喵|〈学猫叫〉/小潘潘 小峰峰 尤克里里曲谱...

热门文章

  1. 2020Android大厂高频面试题(字节跳动+阿里,作为Android开发程序员
  2. 有关statistics
  3. 注册表的使用-入门篇
  4. 【转载!!】一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
  5. Vue判断IE浏览器版本并提示
  6. linux网络协议栈(四)链路层 (5)vlan处理
  7. Embedded Linux S3C2440 Profiling
  8. 短信平台被恶意攻击怎么防御
  9. html width 100 无效,html css 样式中100%width 仍有白边解决办法
  10. 电影推荐系统(数据预处理+模型训练+预测)