这篇简书主要解决两个问题:
1、NMF的原理以及代码实现
2、CNMF的原理以及代码实现
NMF(非负矩阵分解)
NMF算法的基本思想是将原始非负矩阵分解为两个非负矩阵的乘积从而对原始高维矩阵进行降维表示。
理论参考NMF理论
代码如下:
import numpy as np
import random
def nmf(X, r, k, e):
'''
X是原始矩阵
r是分解的两个非负矩阵的隐变量维度,要远小于原始矩阵的维度
k是迭代次数
e是理想误差
input X
output U,V
'''
d, n = X.shape
#print(d,n)
#U = np.mat(random.random((d, r)))
U = np.mat(np.random.rand(d, r))
#V = np.mat(random.random((n, r)))
V = np.mat(np.random.rand(n, r))
#print(U, V)
x = 1
for x in range(k):
print('---------------------------------------------------')
print('开始第', x, '轮迭代')
#error
X_pre = U * V.T
E = X - X_pre
#print E
err= 0.0
for i in range(d):
for j in range(n):
err += E[i,j] * E[i,j]
print('误差:', err)
if err < e:
break
#update U
a_u = U * (V.T) * V
b_u = X * V
for i_1 in range(d):
for j_1 in