协同过滤(Collaborative Filtering,CF)是一种常用的推荐算法,主要基于用户的历史行为(如评分、购买记录等)来预测和推荐相似用户喜欢的项目。在Java中实现协同过滤算法,可以采用以下步骤:
-
数据准备:收集用户的历史行为数据,通常以矩阵形式表示,其中行表示用户,列表示项目,矩阵中的值表示用户对项目的评分或交互。
-
计算相似度:根据用户历史行为数据计算用户之间的相似度。常用的相似度计算方法有:
- 余弦相似度(Cosine Similarity)
- 皮尔逊相关系数(Pearson Correlation Coefficient)
- Jaccard 相似度(Jaccard Similarity)
- 欧氏距离(Euclidean Distance)
-
选择相似用户:根据计算得到的相似度,选择与目标用户最相似的K个用户作为邻居。
-
生成推荐:根据相似用户的评分或交互数据,预测目标用户对未评分项目的评分或偏好,并生成推荐列表。
以下是一个简单的Java实现协同过滤的示例:
import java.util.*; public class CollaborativeFiltering { private Map> userRatedItems; private double[][] similarityMatrix; private int K; public CollaborativeFiltering(int[][] ratings, int K) { this.userRatedItems = new HashMap<>(); this.similarityMatrix = new double[ratings.length][ratings.length]; this.K = K; // 初始化用户评分矩阵 for (int i = 0; i < ratings.length; i++) { userRatedItems.put(i, new ArrayList<>()); for (int j = 0; j < ratings[i].length; j++) { userRatedItems.get(i).add(ratings[i][j]); similarityMatrix[i][j] = ratings[i][j]; } } // 计算相似度矩阵 for (int i = 0; i < similarityMatrix.length; i++) { for (int j = i + 1; j < similarityMatrix.length; j++) { similarityMatrix[i][j] = calculateSimilarity(i, j); similarityMatrix[j][i] = similarityMatrix[i][j]; } } } private double calculateSimilarity(int user1, int user2) { // 这里使用皮尔逊相关系数计算相似度,可根据需要选择其他方法 double sum1 = 0; double sum2 = 0; double sumProduct = 0; int n = userRatedItems.get(user1).size(); for (int i = 0; i < n; i++) { sum1 += userRatedItems.get(user1).get(i); sum2 += userRatedItems.get(user2).get(i); sumProduct += userRatedItems.get(user1).get(i) * userRatedItems.get(user2).get(i); } return sumProduct / (Math.sqrt(sum1 * sum2)); } public List recommendItems(int userId, int maxRecommendations) { PriorityQueue topKItems = new PriorityQueue<>(Comparator.comparingDouble(itemScore -> itemScore.score).reversed()); for (int i = 0; i < similarityMatrix.length; i++) { if (i != userId) { double similarity = similarityMatrix[userId][i]; List items = userRatedItems.get(i); for (int j = 0; j < items.size(); j++) { if (!userRatedItems.get(userId).contains(j)) { topKItems.add(new ItemScore(items.get(j), similarity)); if (topKItems.size() > maxRecommendations) { topKItems.poll(); } } } } } List recommendations = new ArrayList<>(); while (!topKItems.isEmpty()) { recommendations.add(topKItems.poll().itemId); } return recommendations; } private static class ItemScore { double score; int itemId; public ItemScore(double score, int itemId) { this.score = score; this.itemId = itemId; } } public static void main(String[] args) { int[][] ratings = { {5, 3, 0, 1}, {4, 0, 0, 1}, {1, 1, 0, 5}, {1, 0, 0, 4}, {2, 2, 5, 4} }; int K = 3; CollaborativeFiltering cf = new CollaborativeFiltering(ratings, K); List recommendations = cf.recommendItems(0, 2); System.out.println("Recommendations for user 0: " + recommendations); } }
这个示例中,我们使用了一个简单的用户评分矩阵,并采用皮尔逊相关系数计算用户之间的相似度。然后,根据相似用户的评分数据,为用户生成推荐列表。在实际应用中,可以根据需要调整相似度计算方法、邻居选择策略等参数。