Collaborativ

问题介绍

Collaborative Filtering(协同过滤)是推荐系统中一种常用的技术,用于根据用户的过去行为和与其他用户的相似性来预测用户可能感兴趣的项目。

在本篇文章中,我们将介绍协同过滤的原理和算法,并使用一个虚拟数据集来演示如何实现协同过滤算法,并推荐用户可能感兴趣的项目。

算法原理

协同过滤算法基于两个主要的概念:用户之间的相似性和项目之间的相似性。

用户之间的相似性表示的是当一个用户喜欢一些项目时,与该用户有相似喜好的其他用户也可能喜欢相同的项目。通过计算用户之间的相似性,我们可以预测一个用户对尚未评价的项目的喜好程度。

项目之间的相似性表示的是当一个用户喜欢某个项目时,与该项目相似的其他项目也可能被用户喜欢。通过计算项目之间的相似性,我们可以推荐与用户已经喜欢的项目相似的项目。

公式推导

用户之间的相似性计算公式

在协同过滤中,我们使用余弦相似性来计算用户之间的相似度。给定两个用户$u$和$v$,其相似度可以通过以下公式计算:

$$
\text{sim}(u, v) = \frac{\sum_{i \in I_{uv}} r_{ui} \cdot r_{vi}}{\sqrt{\sum_{i \in I_{uv}} r_{ui}^2} \cdot \sqrt{\sum_{i \in I_{uv}} r_{vi}^2}}
$$

其中,$r_{ui}$表示用户$u$对项目$i$的评分,$I_{uv}$表示同时被用户$u$和$v$评价过的项目集合。

项目之间的相似性计算公式

对于项目之间的相似性,我们同样使用余弦相似性来计算。给定两个项目$i$和$j$,其相似度可以通过以下公式计算:

$$
\text{sim}(i, j) = \frac{\sum_{u \in U_{ij}} r_{ui} \cdot r_{uj}}{\sqrt{\sum_{u \in U_{ij}} r_{ui}^2} \cdot \sqrt{\sum_{u \in U_{ij}} r_{uj}^2}}
$$

其中,$r_{ui}$表示用户$u$对项目$i$的评分,$U_{ij}$表示同时评价过项目$i$和$j$的用户集合。

计算步骤

根据上述的公式,我们可以将协同过滤算法的计算步骤总结如下:

  1. 计算用户之间的相似度:对于每对用户$u$和$v$,计算它们的相似度。

  2. 计算项目之间的相似度:对于每对项目$i$和$j$,计算它们的相似度。

  3. 预测用户对项目的评分:对于每个用户$u$和每个项目$i$,根据其他与用户$u$相似的用户对项目$i$的评分,预测用户$u$对项目$i$的评分。

  4. 根据预测的评分给用户推荐项目:为每个用户推荐一些他们可能感兴趣的项目。

代码示例

接下来,我们将使用Python实现一个简单的协同过滤算法,并使用虚拟数据集进行演示。

首先,我们需要定义一个包含用户评分信息的数据集。假设我们有5个用户和6个项目,用户的评分范围在1到5之间。

ratings = {
 'user1': {'item1': 4, 'item2': 5, 'item3': 3, 'item4': 2, 'item6': 1},
 'user2': {'item1': 3, 'item3': 4, 'item4': 5, 'item5': 2},
 'user3': {'item2': 4, 'item5': 1, 'item6': 3},
 'user4': {'item1': 5, 'item2': 2, 'item4': 1, 'item5': 4},
 'user5': {'item1': 2, 'item3': 3, 'item5': 5, 'item6': 4}
}

接下来,我们定义一个函数来计算用户之间的相似度。

from math import sqrt

def cosine_similarity(user1, user2):
 common_items = set(user1.keys()) & set(user2.keys())

 numerator = sum(user1[item] artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls user2[item] for item in common_items)
 denominator = sqrt(sum(user1[item]**2 for item in common_items)) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls sqrt(sum(user2[item]**2 for item in common_items))

 if denominator == 0:
 return 0

 return numerator / denominator

然后,我们定义一个函数来计算项目之间的相似度。

def item_similarity(ratings, item1, item2):
 common_users = set(ratings.keys()).intersection(ratings[item1].keys(), ratings[item2].keys())

 numerator = sum(ratings[user][item1] artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls ratings[user][item2] for user in common_users)
 denominator = sqrt(sum(ratings[user][item1]**2 for user in common_users)) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls sqrt(sum(ratings[user][item2]**2 for user in common_users))

 if denominator == 0:
 return 0

 return numerator / denominator

接着,我们定义一个函数来预测用户对项目的评分。

def predict_rating(ratings, user, item):
 if item not in ratings[user]:
 user_similarities = [(cosine_similarity(ratings[user], ratings[other_user]), other_user) for other_user in ratings if item in ratings[other_user]]
 user_similarities.sort(reverse=True)

 numerator = sum(similarity artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls ratings[other_user][item] for similarity, other_user in user_similarities[:3])
 denominator = sum(similarity for similarity, _ in user_similarities[:3])

 if denominator == 0:
 return 0

 return numerator / denominator

 return ratings[user][item]

最后,我们定义一个函数来为每个用户推荐项目。

def recommend_items(ratings, user):
 predicted_ratings = [(predict_rating(ratings, user, item), item) for item in ratings[user]]
 predicted_ratings.sort(reverse=True)

 return [item for _, item in predicted_ratings if item not in ratings[user]]

代码细节解释

在上述的代码示例中,我们首先定义了一个包含用户评分信息的字典,其中键是用户的名称,值是一个字典,键是项目的名称,值是用户给该项目的评分。

然后,我们实现了用于计算用户之间相似度的cosine_similarity函数,以及用于计算项目之间相似度的item_similarity函数。

接着,我们实现了predict_rating函数,该函数根据其他与用户相似的用户对项目的评分,预测用户对项目的评分。

最后,我们实现了recommend_items函数,该函数根据预测的评分为每个用户推荐一些他们可能感兴趣的项目。

在使用示例的代码时,我们首先调用recommend_items函数来为每个用户推荐项目,并打印推荐结果。

for user in ratings:
 recommended_items = recommend_items(ratings, user)
 print(f"User '{user}' may be interested in: {recommended_items}")

总结

协同过滤算法是推荐系统中常用的技术之一,通过计算用户之间的相似度和项目之间的相似度,可以预测用户对尚未评价的项目的喜好程度,并为用户推荐可能感兴趣的项目。通过使用合适的数据集和算法实现,我们可以根据用户的行为和其他用户的相似性来进行个性化的推荐。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/823064/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球