推荐算法——非负矩阵分解(NMF)

一、矩阵分解回想

在博文推荐算法——基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解。从而实现对未打分项进行打分。

矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为Vm×n。能够将其分解成两个或者多个矩阵的乘积,如果分解成两个矩阵Wm×k和Hk×n。我们要使得矩阵Wm×k和Hk×n的乘积能够还原原始的矩阵Vm×n:

Vm×n≈Wm×k×Hk×n=V^m×n

当中,矩阵Wm×k表示的是m个用户与k个主题之间的关系,而矩阵Hk×n表示的是k个主题与n个商品之间的关系。

通常在用户对商品进行打分的过程中。打分是非负的,这就要求:

Wm×k?0

Hk×n?0

这便是非负矩阵分解(Non-negtive Matrix Factorization, NMF)的来源。

二、非负矩阵分解

2.1、非负矩阵分解的形式化定义

上面简介了非负矩阵分解的基本含义。简单来讲,非负矩阵分解是在矩阵分解的基础上对分解完毕的矩阵加上非负的限制条件。即对于用户-商品矩阵Vm×n,找到两个矩阵Wm×k和Hk×n,使得:

Vm×n≈Wm×k×Hk×n=V^m×n

同一时候要求:

Wm×k?0

Hk×n?0

2.2、损失函数

为了能够定量的比較矩阵Vm×n和矩阵V^m×n的近似程度。在參考文献1中作者提出了两种损失函数的定义方式:

  • 平方距离

∥A?B∥2=∑i,j(Ai,j?Bi,j)2

  • KL散度

D(A∥B)=∑i,j(Ai,jlogAi,jBi,j?Ai,j+Bi,j)

在KL散度的定义中,D(A∥B)?0。当且仅当A=B时取得等号。

当定义好损失函数后,须要求解的问题就变成了例如以下的形式,相应于不同的损失函数:

求解例如以下的最小化问题:

  • minimize∥V?WH∥2s.t.W?0,H?0

  • minimizeD(V∥WH)s.t.W?0,H?0

2.3、优化问题的求解

在參考文献1中,作者提出了乘法更新规则(multiplicative update rules),详细的操作例如以下:

对于平方距离的损失函数:

Wi,k=Wi,k(VHT)i,k(WHHT)i,k

Hk,j=Hk,j(WTV)k,j(WTWH)k,j

对于KL散度的损失函数:

Wi,k=Wi,k∑uHk,uVi,u/(WH)i,u∑vHk,v

Hk,j=Hk,j∑uWu,kVu,j/(WH)u,j)∑vWv,k

上述的乘法规则主要是为了在计算的过程中保证非负,而基于梯度下降的方法中,加减运算无法保证非负。事实上上述的乘法更新规则与基于梯度下降的算法是等价的。以下以平方距离为损失函数说明上述过程的等价性:

平方损失函数能够写成:

l=∑i=1m∑j=1n[Vi,j?(∑k=1rWi,k?Hk,j)]2

使用损失函数对Hk,j求偏导数:

?l?Hk,j=∑i=1m∑j=1n[2(Vi,j?(∑k=1rWi,k?Hk,j))?(?Wi,k)]=?2[(WTV)k,j?(WTWH)k,j]

则依照梯度下降法的思路:

Hk,j=Hk,j?ηk,j?l?Hk,j

即为:

Hk,j=Hk,j+ηk,j[(WTV)k,j?(WTWH)k,j]

令ηk,j=Hk,j(WTWH)k,j,即能够得到上述的乘法更新规则的形式。

2.4、非负矩阵分解的实现

对于例如以下的矩阵:

通过非负矩阵分解。得到例如以下的两个矩阵:

对原始矩阵的还原为:

实现的代码

#!/bin/python

from numpy import * 

def load_data(file_path):
    f = open(file_path)
    V = []
    for line in f.readlines():
        lines = line.strip().split("\t")
        data = []
        for x in lines:
            data.append(float(x))
        V.append(data)
    return mat(V)

def train(V, r, k, e):
    m, n = shape(V)
    W = mat(random.random((m, r)))
    H = mat(random.random((r, n)))

    for x in xrange(k):
        #error
        V_pre = W * H
        E = V - V_pre
        #print E
        err = 0.0
        for i in xrange(m):
            for j in xrange(n):
                err += E[i,j] * E[i,j]
        print err

        if err < e:
            break

        a = W.T * V
        b = W.T * W * H
        #c = V * H.T
        #d = W * H * H.T
        for i_1 in xrange(r):
            for j_1 in xrange(n):
                if b[i_1,j_1] != 0:
                    H[i_1,j_1] = H[i_1,j_1] * a[i_1,j_1] / b[i_1,j_1]

        c = V * H.T
        d = W * H * H.T
        for i_2 in xrange(m):
            for j_2 in xrange(r):
                if d[i_2, j_2] != 0:
                    W[i_2,j_2] = W[i_2,j_2] * c[i_2,j_2] / d[i_2, j_2]

    return W,H 

if __name__ == "__main__":
    #file_path = "./data_nmf"
    file_path = "./data1"

    V = load_data(file_path)
    W, H = train(V, 2, 100, 1e-5 )

    print V
    print W
    print H
    print W * H

收敛曲线例如以下图所看到的:

‘‘‘
Date:20160411
@author: zhaozhiyong
‘‘‘

from pylab import *
from numpy import *

data = []

f = open("result_nmf")
for line in f.readlines():
    lines = line.strip()
    data.append(lines)

n = len(data)
x = range(n)
plot(x, data, color=‘r‘,linewidth=3)
plt.title(‘Convergence curve‘)
plt.xlabel(‘generation‘)
plt.ylabel(‘loss‘)
show()

參考文献

时间: 2024-08-11 09:52:01

推荐算法——非负矩阵分解(NMF)的相关文章

融合非负矩阵分解和图全变分的歌曲推荐算法

摘要: Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Processing Laboratory 2 (LTS2), Swiss Federal Institute of Technology (EPFL) Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Proce

非负矩阵分解(4):NMF算法和聚类算法的联系与区别

作者:桂. 时间:2017-04-14   06:22:26 链接:http://www.cnblogs.com/xingshansi/p/6685811.html 声明:欢迎被转载,不过记得注明出处哦~ 前言 之前梳理了一下非负矩阵分解(Nonnegative matrix factorization, NMF),主要有: 1)准则函数及KL散度 2)NMF算法推导与实现 3)拉格朗日乘子法求解NMF(将含限定NMF的求解 一般化) 谱聚类可以参考之前的文章: 1)拉普拉斯矩阵(Laplace

NMF.非负矩阵分解(Non-negative.Matrix.Factorization)实践

1. NMF-based 推荐算法 在例如Netflix或MovieLens这样的推荐系统中,有用户和电影两个集合.给出每个用户对部分电影的打分,希望预测该用户对其他没看过电影的打分值,这样可以根据打分值为其做出推荐.用户和电影的关系,可以用一个矩阵来表示,每一列表示用户,每一行表示电影,每个元素的值表示用户对已经看过的电影的打分.下面来简单介绍一下基于NMF的推荐算法. 在python当中有一个包叫做sklearn,专门用来做机器学习,各种大神的实现算法都在里面.本文使用 from sklea

NMF.非负矩阵分解.--.原理与应用

1.原理 发现写关于非负矩阵的博文还是蛮多的,还是以自己的角度总结一下自己的最近看的若干东西以及对非负矩阵分解有用的一些资料链接.NMF,全称为non-negative matrix factorization,中文呢为"非负矩阵分解". NMF的思想:V=WH(W权重矩阵.H特征矩阵.V原矩阵),通过计算从原矩阵提取权重和特征两个不同的矩阵出来.属于一个无监督学习的算法,其中限制条件就是W和H中的所有元素都要大于0. 写得有点匮竭难懂,看不懂建议去看看原论文,在<NMF引用&g

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

矩阵分解在协同过滤推荐算法中的应用

在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结.(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章) 1. 矩阵分解用于推荐算法要解决的问题 在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户.比如下面的用户物品评分表: 用户\物品 物品1 物品2 物品

NMF非负矩阵分解初探

NMF非负矩阵分解初探 简介 数据可以表示为一个矩阵 $V$,列 $v_n$ 是采样点而行代表特征features.我们想把这个矩阵$V$因式分解为两个未知的矩阵 $W$ 和 $H$ $$ V \approx \hat{V} \equiv WH$$ 这里面 $W$ 是一个经常性出现的patterns的字典(比如音乐中的鼓点),而 $H$ 中的每一列 $h_n$ 表示每一个采样点 $v_n$ 中估测存在的patterns.我们可以把 $W$ 称为字典(dictionary)而 $H$ 成为激活矩阵

分层数据表示模型--多层非负矩阵分解

1 简介 为了理解复杂的数据,人们提出了分层特征提取概念.著名的算法之一是2006年Hinton提出的Deep Belief Network(DBN).随着训练深层结构的成功,人们又提出了许多深度学习的变体.尽管这些多层算法产生了多层方法在特征提取和提供对复杂问题的有效方法,但并没有告诉我们通过多层结构学到的特征之间的关系. 本文我们提出了一个分层数据表示模型,分多层的非负矩阵分解.我们提供了NMF算法的一个变体,nsNMF来进行分层学习.这里,我们通过在数据集上学习层之间的关系直观的展示特征分

非负矩阵分解(1):准则函数及KL散度

作者:桂. 时间:2017-04-06  12:29:26 链接:http://www.cnblogs.com/xingshansi/p/6672908.html 声明:欢迎被转载,不过记得注明出处哦~ 前言 之前在梳理最小二乘的时候,矩阵方程有一类可以利用非负矩阵分解(Non-negative matrix factorization, NMF)的方法求解,经常见到别人提起这个算法,打算对此梳理一下.优化问题求解,最基本的是问题描述与准则函数的定义,紧接着才涉及准则函数的求解问题,本文为NMF