NMF的python实现,在NMF中采用基于欧几里得距离的损失函数来量化近似解的质量;随机初始化矩阵W和H的时候需要限制元素大小在0-255之间,并且要求两个矩阵的乘积在0-255之间 中文注释如何实现
时间: 2024-03-13 21:46:50 浏览: 59
下面是一个简单的NMF Python实现,其中包含了中文注释:
```python
import numpy as np
def nmf(X, n_components, max_iter=100, tol=1e-6):
"""
NMF算法实现
参数
----
X : array-like, shape (n_samples, n_features)
输入数据矩阵,假设有n_samples个样本,每个样本有n_features个特征
n_components : int
分解后的矩阵W和H的列数,也就是特征的数量
max_iter : int, optional, default: 100
最大迭代次数
tol : float, optional, default: 1e-6
迭代收敛的容差值
返回
----
W : array-like, shape (n_samples, n_components)
分解后的矩阵W,包含了输入数据的特征信息
H : array-like, shape (n_components, n_features)
分解后的矩阵H,描述了特征的组合方式
"""
n_samples, n_features = X.shape
# 随机初始化矩阵W和H,并限制元素大小在0-255之间
W = np.random.rand(n_samples, n_components) * 255
H = np.random.rand(n_components, n_features) * 255
# 迭代更新矩阵W和H
for i in range(max_iter):
# 更新矩阵H
X_WH = X.dot(W).dot(H)
H_new = H * (W.T.dot(X) / (W.T.dot(X_WH) + 1e-9))
H_new = np.clip(H_new, 0, 255) # 限制元素大小在0-255之间
if np.linalg.norm(H_new - H) / np.linalg.norm(H) < tol:
# 迭代收敛,停止迭代
H = H_new
break
H = H_new
# 更新矩阵W
X_WH = X.dot(W).dot(H)
W_new = W * (X.dot(H.T) / (X_WH.dot(H.T) + 1e-9))
W_new = np.clip(W_new, 0, 255) # 限制元素大小在0-255之间
if np.linalg.norm(W_new - W) / np.linalg.norm(W) < tol:
# 迭代收敛,停止迭代
W = W_new
break
W = W_new
return W, H
```
其中,更新矩阵W和H的过程就是NMF算法的核心部分。在更新过程中,采用基于欧几里得距离的损失函数来量化近似解的质量。同时,在随机初始化矩阵W和H的时候,需要限制元素大小在0-255之间,并且要求两个矩阵的乘积在0-255之间,这样可以保证NMF算法的稳定性和有效性。
阅读全文