深度学习推荐系统--协同过滤推荐算法+实现代码

本文仅为本人的学习笔记


什么是协同过滤?

协同过滤(Collaborative Filtering)就是协同大家的反馈,评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。

其实它的算法思想就是:物以类聚,人以群分
协同过滤算法一般有2种,一种是基于用户的协同过滤算法,一种是基于物品的协同过滤算法。
基于用户(user-based):跟你喜好相似的人喜欢的东西你也很可能喜欢;
基于物品(item-based):跟你喜欢的东西相似的东西你也很可能喜欢;

用户相似度计算(Similarity Calculation)

1.余弦相似度(Cosine Similarity)

余弦相似度衡量了用户向量i和用户向量j之间的向量夹角大小,夹角越小,证明余弦相似度越大,两个用户越相似
如下图所示,但是很明显,余弦相似度这个方法不考虑长度,只考虑大方向。所以使用余弦相似度计算出的相似度结果有时是不靠谱的。
在这里插入图片描述

2.皮尔逊相关系数(Pearson’s Correlation)

皮尔逊相关系数是对余弦相似度的一个优化,它通过使用用户平均分对各独立评分进行修正,比余弦相似度更多的考虑了长度。即向量a,b各自减去向量的均值后,再计算余弦相似度

3.杰卡德相似度计算(Jaccard coefficient)

以上2种,都是针对于 评分数据是连续的数值,那么如果评分是0,1这种布尔类型的,那么它的相似度通常使用杰卡德相似度计算方法。杰卡德计算方法是 交集/并集


杰卡德相似度计算代码实现

1.构造数据集

创建一个数据集,下面我们使用1和0来表示用户是否购买过该用品

users=["User1","User2","User3","User4","User5"]
items=["Item A","Item B","Item C","Item D","Item E"]
datasets=[
    [1,0,1,1,0],
    [1,0,0,1,1],
    [1,0,1,0,0],
    [0,1,0,1,1],
    [1,1,1,0,1]
]
import pandas as pd

df=pd.DataFrame(datasets,
                columns=items,
                index=users)
print(df)

运行结果:
在这里插入图片描述

2.只计算2个用户之间的相似度

很明显我们的数据是1,0这种布尔类型的,所以比较适合用杰卡德相似度计算的方法

from sklearn.metrics import jaccard_similarity_score

jaccard_similarity_score(df['Item A'],df['Item B'])

结果正确,但是有报错:
在这里插入图片描述
原因是:
在这里插入图片描述

3.计算所有用户之间的相似度

from sklearn.metrics.pairwise import pairwise_distances

user_similar=1-pairwise_distances(df,metric='jaccard')
user_similar=pd.DataFrame(user_similar,columns=users,index=users)
user_similar

但是结果报错:
在这里插入图片描述解决方法,改成以下代码即可:
参考链接:为什么会出现’DataFrame’ object has no attribute ‘dtype’

user_similar=1-pairwise_distances(df.values,metric='jaccard')
user_similar=pd.DataFrame(user_similar,columns=users,index=users)
user_similar

运行结果:
在这里插入图片描述

4.构建推荐结果(基于用户相似度)

为每一个用户找到最相似的2个用户

  • loc[i]:通过行标签索引数据
  • pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据集依照某个字段中的数据进行排序。ascending值表示是否按指定列的数组升序排列,默认为True,即升序排列
  • index[:2]表示从排序之后的结果中切片,取出前两条(相似度最高的两个)
topN_users={}#用来记录相似度最高的几个用户
#遍历每一行数据
for i in user_similar.index:
    #取出每一列数据,并删除自身,然后排序数据,你会发现自身的相似度都是1,下面这句话也就是删除了对角线上的元素。
    _df=user_similar.loc[i].drop([i])
    _df_sorted=_df.sort_values(ascending=False)
    top2=list(_df_sorted.index[:2])
    topN_users[i]=top2
print("Top2相似用户:")
topN_users

运行结果如下:
在这里插入图片描述
**根据topN的相似用户构建推荐结果

  • List item
import numpy as np
rs_results = {}
# 构建推荐结果
for user, sim_users in topN_users.items():
    rs_result = set()    # 存储推荐结果
    for sim_user in sim_users:
        # 构建初始的推荐结果
        rs_result = rs_result.union(set(df.ix[sim_user].replace(0,np.nan).dropna().index))
    # 过滤掉已经购买过的物品
    rs_result -= set(df.ix[user].replace(0,np.nan).dropna().index)
    rs_results[user] = rs_result
print("最终推荐结果:")
rs_results

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于深度学习的视频推荐算法常用的有协同过滤、基于内容的推荐和深度学习推荐等方法。下面以基于深度学习的视频推荐算法为例,给出一个简单的代码实现。 首先,我们需要准备数据集。假设我们有一个视频数据集,其中包含每个用户对于不同视频的评分,我们可以将这个数据集划分成训练集和验证集,然后构建一个基于神经网络的推荐模型。 接下来,我们可以使用 TensorFlow 或者 PyTorch 等深度学习框架来实现推荐模型。以下是一个使用 TensorFlow 实现基于深度学习的视频推荐算法的简单示例代码: ```python import tensorflow as tf # 定义模型参数 num_users = 1000 num_videos = 2000 embedding_dim = 50 # 定义输入变量 user_input = tf.keras.layers.Input(shape=(1,), dtype='int32', name='user_input') video_input = tf.keras.layers.Input(shape=(1,), dtype='int32', name='video_input') # 定义用户和视频的嵌入层 user_embedding = tf.keras.layers.Embedding(input_dim=num_users, output_dim=embedding_dim, input_length=1, name='user_embedding')(user_input) video_embedding = tf.keras.layers.Embedding(input_dim=num_videos, output_dim=embedding_dim, input_length=1, name='video_embedding')(video_input) # 将用户嵌入层和视频嵌入层相乘,并将结果展平 user_video_interaction = tf.keras.layers.Dot(axes=2, name='dot_product')([user_embedding, video_embedding]) user_video_interaction_flat = tf.keras.layers.Flatten(name='flatten')(user_video_interaction) # 定义输出层 output_layer = tf.keras.layers.Dense(units=1, activation='sigmoid', name='output_layer')(user_video_interaction_flat) # 定义模型 model = tf.keras.models.Model(inputs=[user_input, video_input], outputs=output_layer) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(x=[user_train, video_train], y=y_train, batch_size=128, epochs=10, validation_data=([user_val, video_val], y_val)) ``` 以上代码中,我们首先定义了模型参数,包括用户数、视频数和嵌入维度等。然后定义了输入变量和嵌入层,使用了 Dot 层将用户嵌入层和视频嵌入层相乘,并将结果展平。最后定义了输出层,并编译模型,使用训练数据训练模型。 需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值