一、矩阵分解回想

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

矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为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()

參考文献

nmf算法 python_推荐算法——非负矩阵分解(NMF)相关推荐

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

    1. 矩阵分解回顾 在博文推荐算法--基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分.矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品矩阵 ...

  2. 文本主题模型之非负矩阵分解(NMF)

    1. 非负矩阵分解(NMF)概述 非负矩阵分解(non-negative matrix factorization,以下简称NMF)是一种非常常用的矩阵分解方法,它可以适用于很多领域,比如图像特征识别 ...

  3. 【机器学习】(十七)非负矩阵分解NMF:人脸图像特征提取、用特征排序;还原混合信号

    非负矩阵分解(NMF)是一种无监督学习算法,目的在于提取有用的特征(可以识别出组合成数据的原始分量),也可以用于降维,通常不用于对数据进行重建或者编码. 与PCA相同,NMF将每个数据点写成一些分量的 ...

  4. 非负矩阵分解NMF(1): 非调包python实现

    文章目录 1. 矩阵分解(Matrix Factorization): 1.1 公式推导 1.2 代码实现 1.3 在图像数据下的效果 2. 非负矩阵分解(Non-negative Matrix Fa ...

  5. 详解非负矩阵分解(NMF)及其在脑科学中的应用

    非负矩阵分解及其在脑科学中的应用 基本原理 确定最优因子数量 代码实现 非负矩阵分解与主成分分析的区别 非负矩阵分解在脑科学中的应用 应用一:神经发育模式:T2w/T1w比值映射的非负矩阵分解(NMF ...

  6. 基于Spark实现推荐算法-1:推荐算法简介

    个性化推荐系统简介 个性化推荐系统的定义在 1997 年由 Resnick 和 Varian 提出:利用互联网向用户提供信 息和建议,帮助用户选择产品,或模拟售货员帮助用户完成购买行为的系统 .通常推 ...

  7. mahout 推荐算法 java_Mahout推荐算法API详解

    前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了"协同过滤"算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法 ...

  8. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  9. 在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智

    在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智 ...

  10. 在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户、物品的协同过滤推荐算法 个性化推荐算法开发 机器学习、人工智能、大数据分布式开发

    在线电影推荐网 使用Python+Django+Mysql开发技术 在线电影推荐系统 电影网站推荐系统 基于用户.物品的协同过滤推荐算法 个性化推荐算法开发 机器学习.人工智能.大数据分布式开发 Mo ...

最新文章

  1. HTTP 错误 500.21 - Internal Server Error 解决方案
  2. 用python画四叶草代码-python—字符串拼接三种方法
  3. angularjs获取php数据类型,利用Angularjs从PHP读取后台数据
  4. 欧洲冠军联赛决赛结束
  5. elasticsearch同义词配置elasticsearch-analysis-dynamic-synonym
  6. python 注销一大段_Python 编程从入门到实践 第19章 注销一节问题
  7. AWS VPC(二)-----创建VPC Peering
  8. linux 64 iso镜像文件下载地址,Linux(RHEL) ISO镜像文件-下载地址
  9. 我的helper模块(Python)
  10. Chrome快捷键,电脑高手都这样用
  11. appium远程连接---逍遥模拟器
  12. HIVE修改列顺序中的坑
  13. 嵌入式学习之STM32实现OLED
  14. 一个沪漂三年IT青年的感悟
  15. windows ltsc版本没有Microsoft Store怎么解决
  16. 两个字母组成的拼音,域名注册备用
  17. 双线性插值算法推导及代码实现
  18. mysql 递减查询_php – MySQL – 自动递减值
  19. python bz2模块
  20. Protege reasoner 推理机 datatype问题分析

热门文章

  1. kernelbase故障模块_kernelbase.dll故障怎么解决
  2. 计算机网页制作保存,不使用任何工具轻松保存网页资源的法子
  3. 判断多边形是凹多边形还是凸多边形,以及求凹点
  4. 如何编写自己的python包,并进行安装和发布
  5. 记一次hsql解析大json的全过程
  6. Spark入门(一)概述
  7. 在局域网搭建mqtt服务器
  8. informatic 使用注意事项
  9. 微信小程序页面的基本布局方法——flex布局
  10. 涉密计算机用户密码操作规程,涉密计算机管理设置密码