Collaborative Filtering یک روش توصیهگری در سیستمهای یادگیری ماشین است که بر اساس تاریخچه رفتار کاربران، محصولات یا موارد مشابه را به کاربران پیشنهاد میدهد. در این روش، اطلاعاتی که از کاربران دربارهٔ نظرات، امتیازات و تاریخچه خریدشان در اختیار داریم، برای پیشبینی سلیقه و علاقهمندیهای آنها به محصولات جدید استفاده میشود.
در روش Collaborative Filtering، به دو نوع فیلتر اصلی اشاره میشود:
1. User-Based Collaborative Filtering: در این روش، برای پیشنهاد محصولات به یک کاربر، از نظرات و امتیازات کاربرانی که سلیقههای مشابهی با او دارند، استفاده میشود. به عبارت دیگر، محصولاتی که کاربران با سلیقه مشابه به آنها امتیاز بالا دادهاند، به کاربر پیشنهاد میشود.
2. Item-Based Collaborative Filtering: در این روش، به جای پیشنهاد کاربران، محصولاتی که با محصولاتی که کاربر مشتری شده است، مشابهت دارند، به کاربر پیشنهاد میشود. به عبارت دیگر، اگر کاربر یک محصول خاص را خریداری کرده باشد، محصولات مشابه به آن به کاربر پیشنهاد میشود.
از روش Collaborative Filtering در بسیاری از سیستمهای توصیهگری استفاده میشود، مانند سیستمهای پیشنهاد فیلم، کتاب، موسیقی، محصولات الکترونیکی و غیره.
import torch
import torch.nn as nn
import torch.optim as optim
# دادههای رتبهبندی کاربران
user_ratings = torch.tensor([
[5, 4, 0, 1, 0], # کاربر 1
[1, 0, 5, 3, 0], # کاربر 2
[0, 2, 4, 0, 5], # کاربر 3
[3, 0, 0, 2, 4], # کاربر 4
])
# تعریف مدل Collaborative Filtering
class CollaborativeFiltering(nn.Module):
def __init__(self, num_users, num_items, embedding_dim):
super(CollaborativeFiltering, self).__init__()
self.user_embeddings = nn.Embedding(num_users, embedding_dim)
self.item_embeddings = nn.Embedding(num_items, embedding_dim)
self.fc = nn.Linear(embedding_dim, 1)
def forward(self, user_ids, item_ids):
user_embeds = self.user_embeddings(user_ids)
item_embeds = self.item_embeddings(item_ids)
ratings = torch.sum(user_embeds * item_embeds, dim=1)
ratings = self.fc(ratings)
return ratings.squeeze()
# تعریف متغیرهای مدل
num_users = user_ratings.size(0)
num_items = user_ratings.size(1)
embedding_dim = 10
# ایجاد نمونه از مدل
model = CollaborativeFiltering(num_users, num_items, embedding_dim)
# تعریف تابع هدف و بهینهساز
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# آموزش مدل
num_epochs = 100
for epoch in range(num_epochs):
optimizer.zero_grad()
user_ids = torch.tensor([i for i in range(num_users)])
item_ids = torch.tensor([j for j in range(num_items)])
predicted_ratings = model(user_ids, item_ids)
loss = criterion(predicted_ratings, user_ratings.flatten())
loss.backward()
optimizer.step()
# پیشبینی رتبهبندی برای کاربر موردنظر
user_id = 2
item_ids = torch.tensor([j for j in range(num_items)])
predicted_ratings = model(torch.tensor([user_id] * num_items), item_ids)
print(predicted_ratings)