记录协同过滤相关的系列实验(2)

(一)基于物品端的协同过滤

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信息, 可以扩展其他信息,加强信息的表达。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花咪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值