NMF算法 python实现
时间: 2023-09-29 19:11:20 浏览: 108
非负矩阵分解(NMF)Tensorflow实现_Python_下载.zip
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中的每一列作为一张图片进行展示。
阅读全文