(一)基于物品端的协同过滤
2019-Large-scale Collaborative Filtering with Product Embeddings
(二)数据构建
训练集构建上, 样本是用户历史的交互数据(正向交互)+ 当前交互数据 + 当前交互数据类型(正向/负向)
目的就是找出用户喜欢了什么, 来预测其将喜欢什么。
(三)算法实现
def build_model(self):
input_seq = layers.Input(shape=(self.job_seq_len,))
embeding = layers.Embedding(input_dim=len(self.job_id_list) + 1, output_dim=12,
#weights=[self.matrix],
trainable=True)
input_y = layers.Input(shape=(1,))
input_seq_embed = embeding(input_seq)
input_y_embed = embeding(input_y)
attf = Attention_his(seq_len=self.job_seq_len)
att = attf([input_seq_embed, input_y_embed])
dot = layers.Dense(1, activation="relu")(att)
dot = layers.Lambda(lambda x: K.squeeze(x, axis=1))(dot)
model = Model([input_seq, input_y], dot)
adam = Adam(lr=0.0001)
model.compile(optimizer=adam, loss="MSE")
model.summary()
return model
class Attention_his(Layer):
def __init__(self,seq_len, **kwargs):
self.seq_len = seq_len
super(Attention_his,self).__init__(**kwargs)
def build(self, input_shape):
output_dim = input_shape[1][-1]
self.kernels = self.add_weight(name="kernal",
shape=(self.seq_len, output_dim*2, output_dim),
initializer = 'uniform',
trainable = True)
super(Attention_his, self).build(input_shape)
def call(self,x):
hist = x[0]
y = x[1]
historys= tf.split(hist, axis=1, num_or_size_splits=self.seq_len)
for _ in range(self.seq_len):
history = historys[_]
c = K.concatenate((history, y), axis=-1)
kernel = self.kernels[_]
a = K.dot(c, kernel)
y = history * a + y
return y
def get_config(self):
config = {'seq_len': self.seq_len}
base_config = super(Attention_his, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
def compute_output_shape(self, input_shape):
return input_shape[1]
实验结论:
(1)该方法,较前面的方法相比,效果最好。
(2)该方案仅用了id信息, 可以扩展其他信息,加强信息的表达。