【scikit-learn】sklearn.decomposition.NMF 类:非负矩阵分解

sklearn.decomposition.NMF(非负矩阵分解,NMF)

NMF(Non-negative Matrix Factorization,非负矩阵分解)是一种降维和特征提取技术,常用于 稀疏数据,如 文本数据图像数据。它通过将矩阵分解为两个 非负矩阵,有效提取数据的潜在特征。


1. NMF 作用

  • 降维:将大规模稀疏矩阵分解为两个较小的非负矩阵。
  • 特征提取:从原始数据中提取出 潜在的、非负的特征,特别适用于 文本数据分析(如主题建模)推荐系统
  • 数据压缩:减少数据的维度,使数据表示更加紧凑。
  • 推荐系统:在 协同过滤 中,通过分解用户-物品评分矩阵来进行推荐。

2. NMF vs. PCA

方法适用情况主要区别
PCA适用于线性降维数据不要求非负,但不能处理稀疏数据
NMF适用于非负数据降维分解后的矩阵为非负数,适合稀疏数据,如文本数据

3. NMF 代码示例

(1) 训练 NMF

from sklearn.decomposition import NMF
import numpy as np

# 生成一个非负矩阵
X = np.abs(np.random.rand(100, 10))  # 生成非负数据

# 使用 NMF 进行降维
nmf = NMF(n_components=2, random_state=42)
X_nmf = nmf.fit_transform(X)

print("NMF 降维后的数据形状:", X_nmf.shape)

解释

  • n_components=2:将数据降到 2 维。
  • fit_transform(X):训练模型并转换数据。

4. NMF 主要参数

NMF(n_components=2, init='random', random_state=None, max_iter=200, alpha=0, l1_ratio=0.0)
参数说明
n_components主成分数(降维后的维度)
init初始化方法'random''nndsvd',默认 'random'
random_state随机种子(控制初始化一致性)
max_iter最大迭代次数(默认 200,防止收敛失败)
alpha正则化参数(控制模型复杂度)
l1_ratioL1 与 L2 正则化的比例(在 alpha 的帮助下,进行稀疏化)

5. NMF 用于文本数据降维(主题建模)

NMF 可以用于 主题建模,例如从文档数据中提取主题(如 潜在语义分析(LSA))。

from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import TfidfVectorizer

# 生成文本数据
documents = ["机器学习很有趣", "深度学习是人工智能的一部分", "支持向量机和神经网络都是分类算法"]
vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(documents)

# 使用 NMF 进行主题建模
nmf = NMF(n_components=2, random_state=42)
X_nmf = nmf.fit_transform(X_tfidf)

print("主题建模结果(每个文档的主题分布):", X_nmf)

解释

  • TfidfVectorizer:将文本数据转换为 TF-IDF 特征矩阵
  • n_components=2:提取 2 个主题。
  • X_nmf:每个文档对应的主题分布。

6. NMF 可视化

import matplotlib.pyplot as plt
import seaborn as sns

# 可视化降维后的数据
sns.scatterplot(x=X_nmf[:, 0], y=X_nmf[:, 1])
plt.title("NMF 降维结果")
plt.show()

解释

  • 通过散点图 可视化 NMF 降维后的数据,查看数据点的分布。

7. NMFPCA 的对比

from sklearn.decomposition import PCA

# 使用传统 PCA 进行降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 使用 NMF 进行降维
nmf = NMF(n_components=2)
X_nmf = nmf.fit_transform(X)

print("PCA 降维后的数据形状:", X_pca.shape)
print("NMF 降维后的数据形状:", X_nmf.shape)

解释

  • PCA线性降维,且不要求数据为非负。
  • NMF 要求输入数据为 非负,且适用于稀疏数据。

8. 计算聚类性能

from sklearn.metrics import silhouette_score

# 使用 NMF 进行降维
score = silhouette_score(X, X_nmf)
print("轮廓系数:", score)

解释

  • silhouette_score(X, X_nmf):评估降维后的数据聚类效果(值越大越好)。

9. NMF 在推荐系统中的应用

NMF 被广泛应用于 协同过滤推荐系统,例如从 用户-商品评分矩阵 中提取潜在的用户偏好和商品特征。

from sklearn.decomposition import NMF

# 示例用户-商品评分矩阵
X = np.array([[5, 4, 0, 0],
              [3, 0, 0, 2],
              [4, 0, 0, 3],
              [0, 4, 0, 5]])

# 使用 NMF 进行矩阵分解
nmf = NMF(n_components=2)
X_nmf = nmf.fit_transform(X)

print("推荐系统降维后的数据形状:", X_nmf.shape)

解释

  • X_nmf:通过分解用户-商品评分矩阵得到的 潜在用户偏好和商品特征

10. 适用场景

  • 主题建模(如 LSA)。
  • 文本数据降维(如 文档聚类文档分类)。
  • 推荐系统(如 协同过滤矩阵分解)。
  • 图像压缩与处理

11. 结论

  • NMF 是一种 非负矩阵分解方法,适用于 稀疏数据,如 文本分析、推荐系统、图像压缩 等应用。它能够将原始数据分解为两个非负矩阵,便于从中提取潜在的特征和模式。通过 控制稀疏性选择合适的 n_componentsNMF 可以有效地提高特征选择的可解释性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值