非负矩阵分解(NMF)

Python 中的无监督学习

Benjamin Wilson

Director of Research at lateral.io

非负矩阵分解

  • NMF = 非负矩阵分解
  • 降维技术
  • NMF 模型可解释(不同于 PCA)
  • 易于解释,便于说明
  • 但所有样本特征必须非负(>= 0)
Python 中的无监督学习

可解释的部分

  • NMF 将文档表示为主题(或"话题")的组合

 

文本框:DataCamp 是数据科学教育的领先者,提供基于技能的培训,开创技术创新…… 约等于 0.6 × 含 program、r、python、function、method 的文本框 + 0.5 × 含 data、analysis、cluster、statistics、mean 的文本框 + 0.7 × 含 teaching、learn、lesson、lessons、course 的文本框

Python 中的无监督学习

可解释的部分

  • NMF 将图像表示为模式的组合

 

3 条纹方块 ≈ 0.98 × 单条纹方块 + 0.91 × 不同条纹方块 + 0.95 × 不同条纹方块

Python 中的无监督学习

使用 scikit-learn 的 NMF

  • 遵循 fit() / transform() 模式
  • 必须指定组件数,如 NMF(n_components=2)
  • 适用于 NumPy 数组和 csr_matrix
Python 中的无监督学习

示例词频数组

  • 词频数组:4 个词,许多文档
  • 用"tf-idf"衡量各文档中的词出现情况
    • "tf" = 词在文档中的频率
    • "idf" 降低高频词的影响

词频数组

Python 中的无监督学习

NMF 示例用法

  • samples 是词频数组
from sklearn.decomposition import NMF

model = NMF(n_components=2)
model.fit(samples)
NMF(n_components=2)
nmf_features = model.transform(samples)
Python 中的无监督学习

NMF 组件

  • NMF 有组件
  • …就像 PCA 有主成分
  • 组件维度 = 样本维度
  • 条目非负
print(model.components_)
[[ 0.01  0.    2.13  0.54]
 [ 0.99  1.47  0.    0.5 ]]
Python 中的无监督学习

NMF 特征

  • NMF 特征值非负
  • 可用于重构样本
  • …将特征值与组件相结合
print(nmf_features)
[[ 0.    0.2 ]
 [ 0.19  0.  ]
  ...
 [ 0.15  0.12]]
Python 中的无监督学习

样本重构

print(samples[i,:])
[ 0.12  0.18  0.32  0.14]
print(nmf_features[i,:])
[ 0.15  0.12]

将 NMF 组件按特征值加权并相加

Python 中的无监督学习

样本重构

  • 组件乘以特征值后相加
  • 也可表示为矩阵乘积
  • 这就是"NMF"中的"矩阵分解"
Python 中的无监督学习

NMF 仅适用于非负数据

  • 各文档的词频
  • 数组形式的图像
  • 音频谱图
  • 电商网站的购买历史
  • ……还有更多!
Python 中的无监督学习

Passons à la pratique !

Python 中的无监督学习

Preparing Video For Download...