博主介绍:全网个人号和企业号粉丝40W+,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战
⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到
有成品项目也可定制,需求的各位可以先收藏起来
文章结尾有联系名片找我
在电商平台中,基于物品的协同过滤(Item-based Collaborative Filtering)是一种常用的推荐算法。它的核心思想是:如果用户喜欢某些物品,那么他们可能也会喜欢与这些物品相似的其他物品。
下面是一个简单的Java实现,基于物品的协同过滤算法,用于推荐与用户已购买物品相似的其他物品。
假设我们有以下数据结构:
User
:用户类,包含用户ID和购买记录。Item
:物品类,包含物品ID和物品名称。Order
:订单类,包含用户ID和物品ID。import java.util.*;
class User {
int userId;
List<Integer> purchasedItems; // 用户购买过的物品ID列表
public User(int userId, List<Integer> purchasedItems) {
this.userId = userId;
this.purchasedItems = purchasedItems;
}
}
class Item {
int itemId;
String itemName;
public Item(int itemId, String itemName) {
this.itemId = itemId;
this.itemName = itemName;
}
}
class Order {
int userId;
int itemId;
public Order(int userId, int itemId) {
this.userId = userId;
this.itemId = itemId;
}
}
我们使用余弦相似度来计算物品之间的相似度。
class ItemSimilarity {
// 计算两个物品的余弦相似度
public static double cosineSimilarity(Map<Integer, Double> item1, Map<Integer, Double> item2) {
double dotProduct = 0.0;
double norm1 = 0.0;
double norm2 = 0.0;
for (int userId : item1.keySet()) {
if (item2.containsKey(userId)) {
dotProduct += item1.get(userId) * item2.get(userId);
}
norm1 += Math.pow(item1.get(userId), 2);
}
for (double value : item2.values()) {
norm2 += Math.pow(value, 2);
}
if (norm1 == 0.0 || norm2 == 0.0) {
return 0.0;
} else {
return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}
}
}
我们需要构建一个物品-用户矩阵,表示每个物品被哪些用户购买过。
class ItemUserMatrix {
// 构建物品-用户矩阵
public static Map<Integer, Map<Integer, Double>> buildItemUserMatrix(List<Order> orders) {
Map<Integer, Map<Integer, Double>> itemUserMatrix = new HashMap<>();
for (Order order : orders) {
itemUserMatrix.putIfAbsent(order.itemId, new HashMap<>());
itemUserMatrix.get(order.itemId).put(order.userId, 1.0); // 这里假设每个用户对物品的评分是1.0
}
return itemUserMatrix;
}
}
接下来,我们计算物品之间的相似度矩阵。
class ItemSimilarityMatrix {
// 计算物品相似度矩阵
public static Map<Integer, Map<Integer, Double>> buildItemSimilarityMatrix(Map<Integer, Map<Integer, Double>> itemUserMatrix) {
Map<Integer, Map<Integer, Double>> itemSimilarityMatrix = new HashMap<>();
List<Integer> itemIds = new ArrayList<>(itemUserMatrix.keySet());
for (int i = 0; i < itemIds.size(); i++) {
int item1 = itemIds.get(i);
itemSimilarityMatrix.putIfAbsent(item1, new HashMap<>());
for (int j = i + 1; j < itemIds.size(); j++) {
int item2 = itemIds.get(j);
double similarity = ItemSimilarity.cosineSimilarity(itemUserMatrix.get(item1), itemUserMatrix.get(item2));
itemSimilarityMatrix.get(item1).put(item2, similarity);
itemSimilarityMatrix.putIfAbsent(item2, new HashMap<>());
itemSimilarityMatrix.get(item2).put(item1, similarity);
}
}
return itemSimilarityMatrix;
}
}
最后,我们根据用户已购买的物品,推荐与他们购买物品相似的其他物品。
class ItemBasedCF {
// 基于物品的协同过滤推荐
public static List<Integer> recommendItems(int userId, List<User> users, Map<Integer, Map<Integer, Double>> itemSimilarityMatrix, int topN) {
List<Integer> recommendedItems = new ArrayList<>();
Set<Integer> userPurchasedItems = new HashSet<>();
// 找到用户购买过的物品
for (User user : users) {
if (user.userId == userId) {
userPurchasedItems.addAll(user.purchasedItems);
break;
}
}
// 计算推荐物品的得分
Map<Integer, Double> itemScores = new HashMap<>();
for (int purchasedItem : userPurchasedItems) {
if (itemSimilarityMatrix.containsKey(purchasedItem)) {
for (Map.Entry<Integer, Double> entry : itemSimilarityMatrix.get(purchasedItem).entrySet()) {
int similarItem = entry.getKey();
double similarity = entry.getValue();
if (!userPurchasedItems.contains(similarItem)) {
itemScores.put(similarItem, itemScores.getOrDefault(similarItem, 0.0) + similarity);
}
}
}
}
// 按得分排序,取前topN个物品
itemScores.entrySet().stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.limit(topN)
.forEach(entry -> recommendedItems.add(entry.getKey()));
return recommendedItems;
}
}
public class Main {
public static void main(String[] args) {
// 模拟数据
List<User> users = Arrays.asList(
new User(1, Arrays.asList(101, 102)),
new User(2, Arrays.asList(101, 103)),
new User(3, Arrays.asList(102, 104))
);
List<Order> orders = Arrays.asList(
new Order(1, 101),
new Order(1, 102),
new Order(2, 101),
new Order(2, 103),
new Order(3, 102),
new Order(3, 104)
);
// 构建物品-用户矩阵
Map<Integer, Map<Integer, Double>> itemUserMatrix = ItemUserMatrix.buildItemUserMatrix(orders);
// 计算物品相似度矩阵
Map<Integer, Map<Integer, Double>> itemSimilarityMatrix = ItemSimilarityMatrix.buildItemSimilarityMatrix(itemUserMatrix);
// 为用户1推荐物品
List<Integer> recommendedItems = ItemBasedCF.recommendItems(1, users, itemSimilarityMatrix, 2);
// 输出推荐结果
System.out.println("Recommended items for user 1: " + recommendedItems);
}
}
假设我们运行上述代码,输出可能是:
Recommended items for user 1: [103, 104]
这个简单的Java实现展示了如何基于物品的协同过滤算法为用户推荐物品。实际应用中,数据量可能会非常大,因此需要考虑性能优化和分布式计算等问题。此外,还可以结合其他推荐算法(如基于用户的协同过滤、矩阵分解等)来提高推荐的准确性。