本文主要是介绍推荐系统之矩阵分解(MF)及其python代码讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
推荐系统之矩阵分解(MF)及其python实现
完整代码如下
from math import *
import numpy as np
import matplotlib.pyplot as pltdef MF(R,P,Q,K,aplha,beta,steps):''':param R: 用户-物品评分矩阵 m*n:param P: 用户的分解矩阵 m*k:param Q: 物品的分接矩阵 m*k:param K: 隐向量的维度:param aplha: 学习率:param beta: 正则化参数:param steps::return:'''print('开始分解原矩阵')Q=Q.Tresult=[]#开始训练 更新参数 计算损失值#更新参数 使用梯度下降方法print('开始训练')for step in range(steps):''''''for i in range(len(R)):for j in range(len(R[i])):eij=R[i][j]-np.dot(P[i,:],Q[:,j])for k in range(K):if R[i][j]>0:#更新参数P[i][k]=P[i][k]+aplha*(2*eij*Q[k][j]-beta*P[i][k])Q[k][j]=Q[k][j]+aplha*(2*eij*P[i][k]-beta*Q[k][j])eR=np.dot(P,Q)#计算损失值e=0for i in range(len(R)):for j in range(len(R[i])):if R[i][j] > 0:e = e + pow(R[i][j] - np.dot(P[i, :], Q[:, j]), 2) # 损失函数求和for k in range(K):e = e + (beta / 2) * (pow(P[i][k], 2) + pow(Q[k][j], 2)) # 加入正则化后的损失函数求和result.append(e)if e < 0.001:breakprint('training Finshed 。。。。')return P, Q.T, resultif __name__ == '__main__': #主函数R=[ #原始矩阵[5,3,0,1],[4,0,0,1],[1,1,0,5],[1,0,0,4],[0,1,5,4]]R=np.array(R)N=len(R) #原矩阵R的行数M=len(R[0]) #原矩阵R的列数K=3 #K值可根据需求改变P=np.random.rand(N,K) #随机生成一个 N行 K列的矩阵Q=np.random.rand(M,K) #随机生成一个 M行 K列的矩阵nP,nQ,result=MF(R,P,Q,K,aplha=0.0002,beta=0.02,steps=5000)print(result)print('原矩阵',R) #输出原矩阵R_MF=np.dot(nP,nQ.T)print('计算出的矩阵',R_MF) #输出新矩阵#画图plt.plot(range(len(result)),result)plt.xlabel("time")plt.ylabel("loss")plt.show()
这篇关于推荐系统之矩阵分解(MF)及其python代码讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!