题目描述:
协同过滤是推荐系统中的一种常用技术,其基本思想是利用用户之间的相似性或物品之间的相似性来进行推荐。本次面试题要求实现一个基于用户的协同过滤推荐算法。
具体要求:
定义两个类:User 和 Item,分别表示用户和物品。
User 类包含用户ID和用户对各个物品的评分(使用Map<Item, Integer>存储)。
Item 类包含物品ID。
实现一个方法 calculateSimilarity(User user1, User user2),计算两个用户之间的相似度。相似度计算可以使用余弦相似度。
实现一个方法 recommendItems(User targetUser, List<User> otherUsers, int topN),为目标用户推荐N个最可能的物品。推荐逻辑是:找出与目标用户最相似的K个用户,然后根据这些用户的评分来推荐物品。
示例代码:
import java.util.*;
class User {
private String userId;
private Map<String, Integer> ratings;
public User(String userId) {
this.userId = userId;
this.ratings = new HashMap<>();
}
public void addRating(String item, int rating) {
ratings.put(item, rating);
}
public Map<String, Integer> getRatings() {
return ratings;
}
public static double calculateSimilarity(User user1, User user2) {
Map<String, Integer> ratings1 = user1.getRatings();
Map<String, Integer> ratings2 = user2.getRatings();
double similarity = 0.0;
for (String item : ratings1.keySet()) {
if (ratings2.containsKey(item)) {
similarity += ratings1.get(item) * ratings2.get(item);
}
}
return similarity / (Math.sqrt(ratings1.size() * ratings2.size());
}
public static List<String> recommendItems(User targetUser, List<User> otherUsers, int topN) {
Map<User, Double> similarityScores = new HashMap<>();
for (User user : otherUsers) {
if (!user.equals(targetUser)) {
double similarity = calculateSimilarity(targetUser, user);
similarityScores.put(user, similarity);
}
}
List<Map.Entry<User, Double>> sortedUsers = new ArrayList<>(similarityScores.entrySet());
sortedUsers.sort((a, b) -> b.getValue().compareTo(a.getValue()));
Map<String, Integer> targetRatings = targetUser.getRatings();
List<String> recommendedItems = new ArrayList<>();
for (int i = 0; i < Math.min(topN, sortedUsers.size()); i++) {
User similarUser = sortedUsers.get(i).getKey();
Map<String, Integer> similarRatings = similarUser.getRatings();
for (String item : similarRatings.keySet()) {
if (!targetRatings.containsKey(item)) {
recommendedItems.add(item);
}
}
return recommendedItems;
}
public static void main(String[] args) {
// Example usage
User user1 = new User("1");
User user2 = new User("2");
User user3 = new User("3");
user1.addRating("item1", 5);
user1.addRating("item2", 3);
user2.addRating("item1", 4);
user2.addRating("item3", 2);
user3.addRating("item2", 5);
user3.addRating("item3", 4);
List<String> recommendations = recommendItems(user1, Arrays.asList(user2, user3), 2);
System.out.println("Recommended items for user1: " + recommendations);
}
}