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_ratio | L1 与 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. NMF
与 PCA
的对比
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_components
,NMF
可以有效地提高特征选择的可解释性。