【机器学习】(十七)非负矩阵分解NMF:人脸图像特征提取、用特征排序;还原混合信号
非负矩阵分解(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:人脸图像特征提取、用特征排序;还原混合信号相关推荐
- 非负矩阵分解提取人脸特征
非负矩阵分解原理 顾名思义:是一个矩阵分解,并且分解矩阵非负.看起来这句话给人的信息量不大,背后却能挖掘NMF为什么会被提出且广泛被运用的原因. 首先是NMF是一个矩阵分解,它和PCA(主成分分析). ...
- 文本主题模型之非负矩阵分解(NMF)
1. 非负矩阵分解(NMF)概述 非负矩阵分解(non-negative matrix factorization,以下简称NMF)是一种非常常用的矩阵分解方法,它可以适用于很多领域,比如图像特征识别 ...
- Python人脸图像特征提取(HOG、Dlib、CNN方法)
Python人脸图像特征提取(HOG.Dlib.CNN方法) 一.HOG人脸图像特征提取 1.HOG特征: 1) 主要思想: 2) 实现方法: 3) 性能提高: 4) 优点 2.HOG特征提取算法的实 ...
- 非负矩阵分解NMF(1): 非调包python实现
文章目录 1. 矩阵分解(Matrix Factorization): 1.1 公式推导 1.2 代码实现 1.3 在图像数据下的效果 2. 非负矩阵分解(Non-negative Matrix Fa ...
- 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制
PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了.下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维. 把原始数据中每个样本用一个向量表示,然后把所 ...
- 详解非负矩阵分解(NMF)及其在脑科学中的应用
非负矩阵分解及其在脑科学中的应用 基本原理 确定最优因子数量 代码实现 非负矩阵分解与主成分分析的区别 非负矩阵分解在脑科学中的应用 应用一:神经发育模式:T2w/T1w比值映射的非负矩阵分解(NMF ...
- 人脸图像特征提取的各种方法、笑脸识别及口罩识别
人脸图像特征提取的各种方法.笑脸识别及口罩识别 一.人脸图像特征提取的各种方法 (一)HOG 1.HOG定义 2.HOG提取的图像信息 3.HOG算法的基本流程 (二)Dlib (三)卷积神经网络特征 ...
- 推荐算法——非负矩阵分解(NMF)
1. 矩阵分解回顾 在博文推荐算法--基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分.矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品矩阵 ...
- 机器学习:非负矩阵分解(NMF)
最新文章
- 【问题收录】ImportError No module named MySQLdb 问题解决
- 队列判空_数据结构与算法——队列的C语言实现
- php 循环写入 缓冲,php利用缓冲实现动态输出(flush,ob_flush)
- php range第二个参数比第一个小,鲜为人知的 PHP range() 函数
- 图像的zoomfft变换
- 使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接
- java服务器端测试_java-在服务器端测试Spring Web Services端点?
- C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
- python输出隔4个字符_python怎么实现每隔几个字符分割
- SQL to ElasticSearch DSL改进
- Ubuntu用Apache2快速搭建一个HTTP文件服务器
- 概念梳理:C++中iostream头文件和命名空间的基础介绍和拓展内容
- SQL学习笔记(06)_SELECT INTO
- 浏览器https证书存在错误怎么办?
- HEVC: I帧、P帧及B帧
- 固态硬盘与机械硬盘数据迁移
- 测试学习小结:测试的7种分类
- WEB端显示三维地形模型
- OpenCV学习笔记-傅里叶变换
- 计算机我们一起学猫叫谱子,一起喵喵喵喵喵|〈学猫叫〉/小潘潘 小峰峰 尤克里里曲谱...
热门文章
- 2020Android大厂高频面试题(字节跳动+阿里,作为Android开发程序员
- 有关statistics
- 注册表的使用-入门篇
- 【转载!!】一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
- Vue判断IE浏览器版本并提示
- linux网络协议栈(四)链路层 (5)vlan处理
- Embedded Linux S3C2440 Profiling
- 短信平台被恶意攻击怎么防御
- html width 100 无效,html css 样式中100%width 仍有白边解决办法
- 电影推荐系统(数据预处理+模型训练+预测)