推荐算法——非负矩阵分解(NMF)
来源:互联网 发布:广发基金工资很高知乎 编辑:程序博客网 时间:2024/04/19 19:23
一、矩阵分解回顾
在博文推荐算法——基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分。矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为
其中,矩阵
通常在用户对商品进行打分的过程中,打分是非负的,这就要求:
这便是非负矩阵分解(Non-negtive Matrix Factorization, NMF)的来源。
二、非负矩阵分解
2.1、非负矩阵分解的形式化定义
上面简单介绍了非负矩阵分解的基本含义,简单来讲,非负矩阵分解是在矩阵分解的基础上对分解完成的矩阵加上非负的限制条件,即对于用户-商品矩阵
同时要求:
2.2、损失函数
为了能够定量的比较矩阵
- 平方距离
- KL散度
在KL散度的定义中,
当定义好损失函数后,需要求解的问题就变成了如下的形式,对应于不同的损失函数:
求解如下的最小化问题:
minimize∥V−WH∥2s.t.W⩾0,H⩾0 minimizeD(V∥WH)s.t.W⩾0,H⩾0
2.3、优化问题的求解
在参考文献1中,作者提出了乘法更新规则(multiplicative update rules),具体的操作如下:
对于平方距离的损失函数:
对于KL散度的损失函数:
上述的乘法规则主要是为了在计算的过程中保证非负,而基于梯度下降的方法中,加减运算无法保证非负,其实上述的乘法更新规则与基于梯度下降的算法是等价的,下面以平方距离为损失函数说明上述过程的等价性:
平方损失函数可以写成:
使用损失函数对
则按照梯度下降法的思路:
即为:
令
2.4、非负矩阵分解的实现
对于如下的矩阵:
通过非负矩阵分解,得到如下的两个矩阵:
对原始矩阵的还原为:
实现的代码
#!/bin/pythonfrom 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()
参考文献
Algorithm for Non-negative Matrix Factorization
白话NMF(Non-negative Matrix Factorization)——Matlab 实现
- 推荐算法——非负矩阵分解(NMF)
- 推荐算法——非负矩阵分解(NMF)
- NMF——非负矩阵分解
- NMF(非负矩阵分解)算法
- NMF(非负矩阵分解)算法
- NMF 非负矩阵分解
- NMF 非负矩阵分解
- 非负矩阵分解NMF
- 非负矩阵分解NMF
- 非负矩阵分解NMF
- NMF非负矩阵分解
- 非负矩阵分解NMF
- NMF非负矩阵分解
- 非负矩阵分解NMF
- 非负矩阵分解NMF
- 线性代数 NMF 非负矩阵分解 Matlab
- 非负矩阵分解(NMF)
- 非负矩阵分解(NMF)简介
- http报错总结
- Android开发中如何获得正确的layout资源(layout-sw480dp layout-sw600dp-land layout-sw720dp-port)
- hibernate 当1对多 关系且用 多端 查询条件 且不用SQL
- SpringMVC 使用对象接收参数
- node.js + MongoDB + AngularJS - 3 开始使用Node.js
- 推荐算法——非负矩阵分解(NMF)
- iOS - 出现( linker command failed with exit code 1)错误总结
- 读书笔记之View之孪生兄弟-SurfaceView
- 怎么快速修改EDIUS中的模板
- object-c URL
- 汽车车型数据库
- UISplitViewController -----3.1学习日志
- 二叉树前序建立(递归、非递归),前序遍历(递归、非递归)
- dp,px,sp单位转换工具类