【数据挖掘】特征抽取之NMF

矩阵分解:找到两个更小的矩阵,两者相乘可以重新构造这个矩阵。

特征矩阵:每一行一个特征,每一列一个item,这些值代表了item对此特征的重要性。


权重矩阵:此矩阵映射特征到aricle矩阵。每行是一个aritcle,每一列是一个特诊,此矩阵反映了多少个特征应用到aritcle上。


矩阵重新构建

【数据挖掘】特征抽取之NMF_第1张图片

 #!/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




你可能感兴趣的:(【数据挖掘】特征抽取之NMF)