矩阵分解:找到两个更小的矩阵,两者相乘可以重新构造这个矩阵。
特征矩阵:每一行一个特征,每一列一个item,这些值代表了item对此特征的重要性。
权重矩阵:此矩阵映射特征到aricle矩阵。每行是一个aritcle,每一列是一个特诊,此矩阵反映了多少个特征应用到aritcle上。
矩阵重新构建
#!/usr/bin/python
import numpy
def difcost(a,b):#距离函数
dif=0
for i in range(numpy.shape(a)[0]):#行数
for j in range(numpy.shape(a)[1]):#列数
dif+=math.pow(a[i][j]-b[i][j],2)
return dif
NMF非负矩阵分解算法实现:
#!/usr/bin/python
#-*-encoding:utf-8-*-
import numpy
def factorize(v,pc=10,iter=50):#此处v为data matrix
ic=numpy.shape(v)[0]
fc=numpy.shape(v)[1]
#初始化权重和特征矩阵
w=numpy.matrix([[random.random() for i in range(pc)]] for i in range(ic))#权重矩阵
h=numpy.matrix([[random.random() for i in range(fc)]] for i in range(pc))#特征矩阵
for i in range(iter):#迭代次数
wh=w*h
cost=difcost(wh,v)
if i%10==0:print cost
if cost == 0:break
hn=(numpy.transpose(w)*v)#权重矩阵转置矩阵*data matrix
hd=(numpy.transpose(w)*w*h)#权重矩阵转置矩阵*权重矩阵*特征矩阵
h=numpy.matrix(numpy.array(h)*numpy.array(hn)/numpy.array(hd))#更新特征矩阵
#更新权重矩阵
wn=(v*numpy.transpose(h))#data matrix*特征矩阵转置矩阵
wd=(w*h**numpy.transpose(h))#特征矩阵转置*权重矩阵*特征矩阵
w=numpy.matrix(numpy.array(w)*numpy.array(wn)/numpy.array(wd))#更新权重矩阵
return w,h