【实例简介】一种基于矩阵分解方法的电影推荐算法

【实例截图】

【核心代码】

import numpy as np

from numba import cuda, float64, jit

from scipy import sparse

import os

import time

time_start=time.time()

cuda.select_device(0)

# 使用jit模式加速单一元素乘法运算

@jit(nopython=True)

def multiply(c, d):

return c * d

# 使用jit模式加速单一元素减法运算

@jit(nopython=True)

def subtract(e, f):

return e - f

# 使用jit模式加速梯度下降算法

@jit(nopython=True)

def gradient_descent(err, p, la, lr, q):

return q ((err * p) - (la * q)) * lr

# Thread Per Block

TPB = int(32)

# 使用cuda.jit模式,用gpu加速矩阵的乘法运算

@cuda.jit

def fast_matmul(a, b, c):

sa = cuda.shared.array(shape=(TPB, TPB), dtype=float64)

sb = cuda.shared.array(shape=(TPB, TPB), dtype=float64)

x, y = cuda.grid(2)

tx = cuda.threadIdx.x

ty = cuda.threadIdx.y

# bpg = cuda.gridDim.x

if x >= c.shape[0] and y >= c.shape[1]:

# Quit if (x, y) is outside of valid C boundary

return

tmp = 0

for i in range(hid):

sa[tx, ty] = a[x, ty i * TPB]

sb[tx, ty] = b[tx i * TPB, y]

cuda.syncthreads()

for j in range(TPB):

tmp = sa[tx, j] * sb[j, ty]

cuda.syncthreads()

c[x, y] = tmp

# Latent Factor Model的随机梯度下降算法

@jit(nopython=True)

def stochastic_loop(q_, p_, i_, j_, err_, la_, lr_, k_):

for r_ in range(k_):

q_[i_, r_] = gradient_descent(err_, p_[r_, j_], la_, lr_, q_[i_, r_])

p_[r_, j_] = gradient_descent(err_, q_[i_, r_], la_, lr_, p_[r_, j_])

# 超参数的设置

iteration = 1000

learning_rate = 0.0002

lambda_ = 0.01

k = 128 # 超参数 factor长度

m = 610

m_ = 640

n = 9742

n_ = 9760

# 读训练数据集,存入稀疏矩阵movie_train中。

row_train = np.array(np.load("train_set.npy")[:,0], dtype='float32')

col_train = np.array(np.load("train_set.npy")[:,1], dtype='float32')

data_train = np.array(np.load("train_set.npy")[:,2], dtype='float32')

movie_train = sparse.coo_matrix((data_train,(row_train,col_train)),shape=(m_,n_)).tocsr()

# 读测试数据集,存入稀疏矩阵movie_test中。

row_test = np.array(np.load("test_set.npy")[:,0], dtype='float32')

col_test= np.array(np.load("test_set.npy")[:,1], dtype='float32')

data_test = np.array(np.load("test_set.npy")[:,2], dtype='float32')

movie_test = sparse.coo_matrix((data_test,(row_test,col_test)),shape=(m_,n_)).tocsr()

# 由于numba中,gpu的加速必须保证TPB * BPG恰好为所求矩阵的二维大小,因此要用a、b扩充矩阵大小

Q = np.random.rand(m,k) * 0.33

P = np.random.rand(k,n) * 0.33

a = np.zeros((30,k)) # 640 - 610 = 30

b = np.zeros((k,18))

'''

# Q与P为原参数矩阵,EXTEND为它们padding后的矩阵,对原矩阵运算没有影响

Q_EXTEND = np.row_stack((Q,a)) # (640,128)

P_EXTEND = np.column_stack((P,b)) # (128,9760)

'''

multiple = np.zeros([m_,n_])

hid = int((k-1)/TPB) 1

blockdim = (TPB, TPB)

griddim1 = (20, 305)

# 恢复上一次训练的参数

Q_EXTEND = np.load("Q.npy")

P_EXTEND = np.load("P.npy")

noise_q = np.random.rand(m_,k) * 0.003

noise_p = np.random.rand(k, n_) * 0.003

Q_EXTEND = noise_q - np.mean(noise_q)

P_EXTEND = noise_p - np.mean(noise_p)

compare_train = 0.05

compare_test = 0.10

flag = 0 # 学习速率自适应算法的参数

for t in range(iteration):

loss_train = 0

loss_test = 0

# 确保进入cuda.jit的数据在内存中是连续的

A = np.ascontiguousarray(Q_EXTEND)

B = np.ascontiguousarray(P_EXTEND)

fast_matmul[griddim1, blockdim](A, B, multiple)

for index, item in enumerate(row_train):

i = int(item)

j = int(col_train[index])

error = movie_train[i, j] - multiple[i, j]

if index % 10000 == 0:

print(error)

loss_train = np.abs(error)

# 对Q与P的extend矩阵中每个元素进行随机梯度下降

stochastic_loop(Q_EXTEND, P_EXTEND, i, j, error, lambda_, learning_rate, k)

loss_train /= 100685

for index, item in enumerate(row_test):

i = int(item)

j = int(col_test[index])

loss_test = np.abs(movie_test[i, j] - multiple[i, j])

loss_test /= 151

print('iteration%s, loss_train:%s, loss_test:%s' % (t, loss_train, loss_test))

# 若几次迭代后,学习情况良好,则适当调高学习速率learning_rate,加快学习速度

# 及时保存参数矩阵Q与P的EXTEND版本,以便分阶段进行优化

if compare_train > loss_train and compare_test > loss_test:

print("learning_rate:%s" % learning_rate)

flag = flag 1

if flag == 2 and learning_rate < 0.0005:

learning_rate = learning_rate 0.00001

flag = 0

compare_train = loss_train

compare_test = loss_test

np.save("Q.npy", Q_EXTEND)

np.save("P.npy", P_EXTEND)

# 若本次迭代使得loss_train与loss_test中一者升高,则必须降低学习速率,避免梯度过大

else:

print("Warning! The loss is accumulating!")

flag = 0

learning_rate = learning_rate * 0.5

cuda.close()

基于python 的电影推荐算法_基于python语言编程的矩阵分解电影推荐算法相关推荐

  1. 基于矩阵分解的推荐算法,简单入门

    摘自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞 ...

  2. 基于矩阵分解的CF算法实现(一):(Funk SVD)LFM

    基于矩阵分解的CF算法实现(一):LFM LFM也就是前面提到的Funk SVD矩阵分解 LFM原理解析 LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品 ...

  3. 基于矩阵分解的CF算法实现(二):BiasSvd

    基于矩阵分解的CF算法实现(二):BiasSvd BiasSvd其实就是前面提到的Funk SVD矩阵分解基础上加上了偏置项. BiasSvd 利用BiasSvd预测用户对物品的评分, k k k表示 ...

  4. python交互式和文件式_使用Python创建和自动化交互式仪表盘

    python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...

  5. 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...

    强连通分量分解的Kosaraju算法 今天是算法数据结构专题的第35篇文章,我们来聊聊图论当中的强连通分量分解的Tarjan算法. Kosaraju算法一看这个名字很奇怪就可以猜到它也是一个根据人名起 ...

  6. 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法

    [推荐系统入门到项目实战](三):矩阵分解和ALS算法

  7. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  8. python回归算法_基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归 回归方法就是寻找方差的最小值 y = kx + b xi, ...

  9. 协同过滤算法_基于用户的协同过滤推荐算法原理和实现

    (给算法爱好者加星标,修炼编程内功) 来源:Create Chen's Blog https://www.cnblogs.com/technology/p/4467895.html 在推荐系统众多方法 ...

最新文章

  1. java内存问题排查及分析
  2. MessagePack:一种高效二进制序列化格式
  3. java消费者和生产者模型_Java实现简易生产者消费者模型过程解析
  4. 根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...
  5. freopen()的重定向打开或者关闭
  6. MySQL-5.5.33主从复制
  7. 前端学习(2322):angular内容介绍
  8. 精读linux源码,Linux基础入门的操作精读.doc
  9. MaxCompute中如何通过logview诊断慢作业
  10. 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
  11. php商品显示循环,php – 如何在循环中显示GROUP BY数据
  12. 杂:(4)NE555
  13. ci 页面php代码,Cicool v3.1.0 - PHP页面、表单、API、CRUD生成器
  14. ionic build android release,ionic build android -release运行报错
  15. 编写一个购物车程序,实现在界面中以列表的形式显示购物车的商品信息,商品信息包括商品名称、价格和数量功能,并能够对购物车中的商品信息进行增删改查
  16. COVID-19席卷全球,看看GIS建模可视化能做些什么
  17. ecshop后台出现Strict Standards: Only variables should be passed by refin /var/www·····
  18. QQ空间最新免费个人形象设置方法
  19. awk详解:awk语言及应用
  20. 建模配置 | Revit建模到底需要什么配置

热门文章

  1. 直播-动态礼物(豪华礼物)
  2. 同源基因鉴定 | OrthoFinder 2.0 + MAFFT + IQtree
  3. 详解MOS管阈值电压与沟长和沟宽的关系及影响阈值电压的因素
  4. 进程创建与撤销的模拟实现
  5. linux shell打印序号,Bash脚本编号生成器
  6. windows 下.bat 文件双击无法运行
  7. 【QT】qt实现多人屏幕共享系统
  8. jvm中GC日志格式详解(十)
  9. bootstrap4侧边栏_如何使用纯CSS和Bootstrap 4构建多个堆叠式粘性侧边栏
  10. 山东大学计算机专业郭炅,山东大学计算机科学与技术学院研究生导师简介-郭炅...