NMF算法推导

推荐一个博客大牛:
文本主题模型之非负矩阵分解(NMF)

V m ∗ n ≈ W m ∗ r H r ∗ n V_{m*n} \approx W_{m*r}H_{r*n} VmnWmrHrn

NMF有两种推导方法一种是欧氏距离,另一种是KL散度。

基于欧式距离推导

在这里插入图片描述
在这里插入图片描述

基于KL散度推导

在这里插入图片描述

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NMF算法(非负矩阵分解)是一种常用的数据降维方法,可以将一个大矩阵分解为两个小矩阵的乘积,其中这两个小矩阵中的元素都是非负的。NMF算法的一个应用是图像压缩,可以将一张彩色图片分解为三个非负矩阵,分别表示红、绿、蓝三个通道的像素值。 以下是NMF算法的Python实现: ```python import numpy as np def nmf(X, k, max_iter=1000, tol=1e-6): """ 非负矩阵分解 :param X: 待分解矩阵,shape为(m, n) :param k: 分解后矩阵的秩 :param max_iter: 最大迭代次数 :param tol: 收敛阈值 :return: 分解后的矩阵W和H """ m, n = X.shape # 随机初始化W和H W = np.random.rand(m, k) H = np.random.rand(k, n) # 迭代更新W和H for i in range(max_iter): # 更新H numerator = np.dot(W.T, X) denominator = np.dot(np.dot(W.T, W), H) + 1e-9 # 避免除0错误 H *= numerator / denominator # 更新W numerator = np.dot(X, H.T) denominator = np.dot(W, np.dot(H, H.T)) + 1e-9 # 避免除0错误 W *= numerator / denominator # 计算误差 err = np.sum((X - np.dot(W, H)) ** 2) if err < tol: break return W, H ``` 使用示例: ```python import matplotlib.pyplot as plt from sklearn.datasets import load_digits # 加载手写数字数据集 digits = load_digits() X = digits.data # 非负矩阵分解 W, H = nmf(X.T, k=30) # 显示分解后的结果 plt.figure(figsize=(10, 4)) for i in range(30): plt.subplot(3, 10, i + 1) plt.imshow(W[:, i].reshape(8, 8), cmap='gray') plt.axis('off') plt.show() ``` 上述示例代码中,使用sklearn.datasets模块加载手写数字数据集,并对其进行非负矩阵分解,得到分解后的矩阵W和H。最后将W中的每一列作为一张图片进行展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值