首页 > 编程语言 >推荐算法——非负矩阵分解(NMF)

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

时间:2023-06-14 20:36:10浏览次数:48  
标签:非负 xrange 矩阵 NMF 分解 print data


1. 矩阵分解回顾

在博文推荐算法——基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分。矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为推荐算法——非负矩阵分解(NMF)_NMF,可以将其分解成两个或者多个矩阵的乘积,假设分解成两个矩阵推荐算法——非负矩阵分解(NMF)_矩阵分解_02推荐算法——非负矩阵分解(NMF)_损失函数_03,我们要使得矩阵推荐算法——非负矩阵分解(NMF)_矩阵分解_02推荐算法——非负矩阵分解(NMF)_损失函数_03的乘积能够还原原始的矩阵推荐算法——非负矩阵分解(NMF)_NMF

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

其中,矩阵推荐算法——非负矩阵分解(NMF)_矩阵分解_02表示的是推荐算法——非负矩阵分解(NMF)_推荐算法_09个用户与推荐算法——非负矩阵分解(NMF)_NMF_10个主题之间的关系,而矩阵推荐算法——非负矩阵分解(NMF)_损失函数_03表示的是推荐算法——非负矩阵分解(NMF)_NMF_10个主题与推荐算法——非负矩阵分解(NMF)_矩阵分解_13个商品之间的关系。

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

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

推荐算法——非负矩阵分解(NMF)_损失函数_15

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

2. 非负矩阵分解

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

上面简单介绍了非负矩阵分解的基本含义,简单来讲,非负矩阵分解是在矩阵分解的基础上对分解完成的矩阵加上非负的限制条件,即对于用户-商品矩阵推荐算法——非负矩阵分解(NMF)_NMF,找到两个矩阵推荐算法——非负矩阵分解(NMF)_矩阵分解_02推荐算法——非负矩阵分解(NMF)_损失函数_03,使得:

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

同时要求:

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

推荐算法——非负矩阵分解(NMF)_损失函数_15

2.2. 损失函数

为了能够定量的比较矩阵推荐算法——非负矩阵分解(NMF)_NMF和矩阵推荐算法——非负矩阵分解(NMF)_NMF_23的近似程度,在参考文献1中作者提出了两种损失函数的定义方式:

  • 平方距离

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

  • KL散度

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

在KL散度的定义中,推荐算法——非负矩阵分解(NMF)_推荐算法_26,当且仅当推荐算法——非负矩阵分解(NMF)_非负矩阵分解_27时取得等号。

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

求解如下的最小化问题:

  • 推荐算法——非负矩阵分解(NMF)_推荐算法_28
  • 推荐算法——非负矩阵分解(NMF)_非负矩阵分解_29

2.3. 优化问题的求解

在参考文献1中,作者提出了乘法更新规则(multiplicative update rules),具体的操作如下:

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

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

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

对于KL散度的损失函数:

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

推荐算法——非负矩阵分解(NMF)_损失函数_33

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

平方损失函数可以写成:

推荐算法——非负矩阵分解(NMF)_损失函数_34

使用损失函数对推荐算法——非负矩阵分解(NMF)_矩阵分解_35求偏导数:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\partia…

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

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

即为:

推荐算法——非负矩阵分解(NMF)_损失函数_37

推荐算法——非负矩阵分解(NMF)_矩阵分解_38,即可以得到上述的乘法更新规则的形式。

2.4. 非负矩阵分解的实现

对于如下的矩阵:

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

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

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

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

对原始矩阵的还原为:

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

实现的代码

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

收敛曲线如下图所示:

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

'''
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()

参考文献


标签:非负,xrange,矩阵,NMF,分解,print,data
From: https://blog.51cto.com/u_16161414/6480418

相关文章

  • 机器学习中的常见问题——K-Means算法与矩阵分解的等价
    一、K-Means算法的基本原理K-Means算法是较为经典的聚类算法,假设训练数据集XX为:{x1,x2,⋯,xn}{x1,x2,⋯,xn},其中,每一个样本xjxj为m......
  • 推荐算法——基于矩阵分解的推荐算法
    一、推荐算法概述对于推荐系统(RecommendSystem,RS),从广义上的理解为:为用户(User)推荐相关的商品(Items)。常用的推荐算法主要有:基于内容的推荐(Content-BasedRecommendation)协同过滤的推荐(CollaborativeFilteringRecommendation)基于关联规则的推荐(AssociationRule-Based......
  • 2373.矩阵中的局部最大值
    问题描述2373.矩阵中的局部最大值(Easy)给你一个大小为nxn的整数矩阵grid。生成一个大小为(n-2)x(n-2)的整数矩阵maxLocal,并满足:maxLocal[i][j]等于grid中以i+1行和j+1列为中心的3x3矩阵中的最大值。换句话说,我们希望找出grid中每个......
  • 什么是全渠道营销?4个软件组建全渠道营销获客矩阵
    2023年可谓是B2B企业营销获客最为严峻的一年。越来越多的营销人纷纷找到我,询问市场部如何开源获客,如何挖掘高ROI的获客渠道等问题。这种焦虑情绪大部分源自CEO和业务部门对应商机需求的巨大压力,因为所有的B2B市场部都在向获客型市场部转型,通过可量化的方式来评估市场对经营的价值......
  • 2319.判断矩阵是否是一个X矩阵
    问题描述2319.判断矩阵是否是一个X矩阵解题思路模拟代码classSolution{public:boolcheckXMatrix(vector<vector<int>>&grid){boolres=true;for(inti=0;i<grid.size();i++){for(intj=0;j<grid[0].size();......
  • 2718. 查询后矩阵的和 (Medium)
    问题描述2718.查询后矩阵的和(Medium)给你一个整数n和一个下标从0开始的二维数组queries,其中queries[i]=[typeᵢ,indexᵢ,valᵢ]。一开始,给你一个下标从0开始的nxn矩阵,所有元素均为0。每一个查询,你需要执行以下操作之一:如果typeᵢ==0,将第index......
  • 矩阵乘法模板代码
    CImod=1e9+7;structmatrix{inta[maxm][maxm],n,m;};matrixmatrixMul(matrixp,matrixq){matrixres;res.n=p.n,res.m=q.m;f(i,0,res.n-1)f(j,0,res.m-1){ res.a[i][j]=0;f(k,0,p.m-1)......
  • python 中使用zip实现矩阵转置
     001、[root@PC1test04]#lsa.txttest.py[root@PC1test04]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930[root@PC1test04]#cattest.py##测试程序#!/usr/bin/envpython#-*......
  • 51nod-1158 全是1的最大子矩阵(单调栈)
    原题链接1158 全是1的最大子矩阵基准时间限制:1 秒空间限制:131072 KB分值: 80 难度:5级算法题 收藏 关注Input第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。......
  • 杨氏矩阵中找是否存在k
    //杨氏矩阵查找k是否存在时间复杂数小于O(N),O(N)为穷举法用的时间intFindNum1(int(*arr)[3],intk,introw,intcol){ inti=0; intj=col-1; while(i<row&&j>0) { if(arr[i][j]<k) { i++; } elseif(arr[i][j]>k) { j--; } else { return......