May you be faithful to yourself, live earnestly and laugh freel.
Keras 实现矩阵分解
推荐系统算法简介 这里简单介绍下推荐系统中最为主要的协同过滤算法,大致分为如下几类:
- 基于用户的协同过滤(给用户推荐与他相似的人购买的物品)
- 基于商品的协同过滤(给用户推荐和他之前喜欢的物品相似的物品)
- 基于模型的协同过滤:关联算法,聚类算法,分类算法,回归算法,矩阵分解,神经网络,图模型以及隐语义模型都属于这个范畴。
之前用了python来写矩阵分解,现在换种写法,用keras来实现矩阵分解。
导入数据
代码语言:javascript复制import pandas as pd
import numpy as np
rating = pd.read_csv('data/ratings.csv',sep=',')
num_user = np.max(rating['userId'])
num_movie = np.max(rating['movieId'])
print(num_user,num_movie,len(rating))
代码语言:javascript复制#计算用户电影组合的R矩阵填充率
R = len(rating)/(num_user*num_movie)
print(f"矩阵填充率:{R}")
矩阵的填充率为:0.000853805025622708
搭建模型
代码语言:javascript复制from keras import Model
import keras.backend as K
from keras.layers import Embedding ,Reshape,Input,Dot
K.clear_session()
def Recomand_model(num_user,num_movie,k):
input_user = Input(shape=[None,],dtype='int32')
model_user = Embedding(num_user 1,k,input_length = 1)(input_user)
model_user = Reshape((k,))(model_user)
input_moive = Input(shape=[None,],dtype="int32")
model_moive = Embedding(num_movie 1,k,input_length = 1)(input_moive)
model_moive = Reshape((k,))(model_moive)
out = Dot(1)([model_user,model_moive])
model = Model(input=[input_user,input_moive],outputs = out)
model.compile(loss = 'mse',optimizer = 'Adam')
model.summary()
return model
代码语言:javascript复制model =Recomand_model(num_user,num_movie,100)
注
model.summary()
输出模型各层的参数状况
model.layers.Reshape() :将输出调整为特定的形状
数据处理
代码语言:javascript复制train_u = rating['userId'].values
train_i = rating['movieId'].values
train_x = [train_u,train_i]
train_y = rating["rating"].values
训练模型
代码语言:javascript复制model.fit(train_x,train_y,batch_size = 100,epochs = 10)
预测
代码语言:javascript复制model.predict([[1],[2]])
代码语言:javascript复制array([[ 3.76612234]], dtype=float32)