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

gavanwanggw gavanwanggw     2022-09-14     128

关键词:

一、矩阵分解回想

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

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

Vm×nWm×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×kHk×n,使得:

Vm×nWm×k×Hk×n=V^m×n

同一时候要求:

Wm×k?0

Hk×n?0

2.2、损失函数

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

  • 平方距离

A?B2=i,j(Ai,j?Bi,j)2

  • KL散度

D(AB)=i,j(Ai,jlogAi,jBi,j?Ai,j+Bi,j)

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

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

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

  • minimizeV?WH2s.t.W?0,H?0

  • minimizeD(VWH)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,kuHk,uVi,u/(WH)i,uvHk,v

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

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

平方损失函数能够写成:

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

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

?l?Hk,j=i=1mj=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("	")
        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()

參考文献


文本主题模型之非负矩阵分解(nmf)(代码片段)

...问题。这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解,但是计算量和处理速度则比LSI快,它是怎么做到的呢?1. 非负矩阵分解(NMF)概述    非负矩阵分解(non-negativematrixfactoriz... 查看详情

机器学习笔记:非负矩阵分解问题nmf(代码片段)

...NMF(Non-negativematrixfactorization),即对于任意给定的一个非负矩阵V,其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件V=W*H,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。        其中,V矩阵中... 查看详情

nmf:non-negativematrixfactorization.

...或负,即使输入的初始矩阵元素是全正的,传统的秩削减算法也不能保证原始数据的非负性。在数学上,从计算的观点看,分解结果中存在负值是正确的,但负值元素在实际问题中往往是没有意义的。例如图像数据中不可能有负... 查看详情

简单的基于矩阵分解的推荐算法-pmf,nmf

介绍:推荐系统中最为主流与经典的技术之一是协同过滤技术(CollaborativeFiltering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱。其中协同过滤技术又可根据是否采用了... 查看详情

语义分析

...想可以简单描述为:对于任意给定的一个非负矩阵A,NMF算法能够寻找到一个非负矩阵U和一个非负矩阵V,使得满足,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。) 原始矩阵的列向量是对左矩阵中所有列向量的加... 查看详情

融合非负矩阵分解和图全变分的歌曲推荐算法(代码片段)

摘要:KirellBenzi,VassilisKalofolias,XavierBressonandPierreVandergheynstSignalProcessingLaboratory2(LTS2),SwissFederalInstituteofTechnology(EPFL)KirellBenzi,VassilisKalofolias,XavierBressonandPierreVande 查看详情

融合非负矩阵分解和图全变分的歌曲推荐算法(代码片段)

摘要:KirellBenzi,VassilisKalofolias,XavierBressonandPierreVandergheynstSignalProcessingLaboratory2(LTS2),SwissFederalInstituteofTechnology(EPFL)KirellBenzi,VassilisKalofolias,XavierBressonandPierreVande 查看详情

R中的对称非负矩阵分解

】R中的对称非负矩阵分解【英文标题】:SymmetricNonnegativeMatrixFactorizationinR【发布时间】:2016-02-1118:41:19【问题描述】:我正在尝试根据以下公式在R中实现NMF:H最初是猜测,然后根据这个公式迭代更新。我写了这段代码,但它需... 查看详情

推荐系统笔记:基于非负矩阵分解的协同过滤

1非负矩阵分解        非负矩阵分解(NMF)可用于非负的评级矩阵。这种方法的主要优势不一定是准确性,而是它在理解用户-项目交互方面提供的高度可解释性。        与其他形式的矩阵分解的主要区别在于因子U和V... 查看详情

非负矩阵分解:交替最小二乘法

】非负矩阵分解:交替最小二乘法【英文标题】:NonnegativeMatrixFactorization:TheAlternatingLeastSquaresMethod【发布时间】:2015-12-1306:29:28【问题描述】:我正在尝试使用交替最小二乘法实现NMF。我只是对以下问题的基本实现感到好奇:如... 查看详情

非负矩阵分解:准则函数及kl散度

...言之前在梳理最小二乘的时候,矩阵方程有一类可以利用非负矩阵分解(Non-negativematrixfactorization,NMF)的方法求解,经常见到别人提起这个算 查看详情

SKLearn NMF 与自定义 NMF

...:53:24【问题描述】:我正在尝试使用非负矩阵分解来构建推荐系统。使用scikit-learnNMF作为模型,我拟合了我的数据,导致了一定的损失(即重建错误)。然后我使用inverse_transform方法为新数据生成推荐。现在我使用我在TensorFlow中... 查看详情

处理零和缺失数据的Python非负矩阵分解?

】处理零和缺失数据的Python非负矩阵分解?【英文标题】:PythonNonnegativeMatrixFactorizationthathandlesbothzerosandmissingdata?【发布时间】:2014-05-1103:40:52【问题描述】:我寻找一个具有python接口的NMF实现,并处理丢失的数据和零。我不想... 查看详情

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

    在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法。1.Spark推荐算法概述    在SparkMLlib中,推荐算法这块只实... 查看详情

19推荐系统2矩阵分解算法——协同过滤的进化

文章目录1、矩阵分解算法的原理2、矩阵分解的求解过程3、消除用户和物品打分的偏差4、矩阵分解的优点和局限性针对协同过滤算法的头部效应较明显、泛化能力较弱的问题,矩阵分解算法被提出。矩阵分解在协同过滤算法... 查看详情

推荐系统的各个矩阵分解模型1

推荐系统的各个矩阵分解模型1.SVD当然提到矩阵分解,人们首先想到的是数学中经典的SVD(奇异值)分解,直接上公式:$$M_m imesn=U_m imeskSigma_k imeskV_k imesn^T$$原理和流程当然SVD分解的形式为3个矩阵相乘左右两个矩阵分别表示用户/... 查看详情

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

  在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结。(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学... 查看详情

推荐系统笔记:基于矩阵分解(总结篇)

推荐系统笔记:基于潜在因子模型的协同过滤(latentfactormodel)_UQI-LIUWJ的博客-CSDN博客推荐系统笔记:无任何限制的矩阵分解_UQI-LIUWJ的博客-CSDN博客推荐系统笔记:基于SVD的协同过滤_UQI-LIUWJ的博客-CSDN博客推荐... 查看详情