协同过滤(Collaborative Filtering,CF)是一种常用的推荐算法,主要基于用户的历史行为(如评分、购买记录等)来预测和推荐相似用户喜欢的项目。在Java中实现协同过滤算法,可以采用以下步骤:
数据准备:收集用户的历史行为数据,通常以矩阵形式表示,其中行表示用户,列表示项目,矩阵中的值表示用户对项目的评分或交互。
计算相似度:根据用户历史行为数据计算用户之间的相似度。常用的相似度计算方法有:
选择相似用户:根据计算得到的相似度,选择与目标用户最相似的K个用户作为邻居。
生成推荐:根据相似用户的评分或交互数据,预测目标用户对未评分项目的评分或偏好,并生成推荐列表。
以下是一个简单的Java实现协同过滤的示例:
import java.util.*;
public class CollaborativeFiltering {
private Map<Integer, List<Double>> 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<Integer> recommendItems(int userId, int maxRecommendations) {
PriorityQueue<ItemScore> 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<Double> 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<Integer> 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<Integer> recommendations = cf.recommendItems(0, 2);
System.out.println("Recommendations for user 0: " + recommendations);
}
}
这个示例中,我们使用了一个简单的用户评分矩阵,并采用皮尔逊相关系数计算用户之间的相似度。然后,根据相似用户的评分数据,为用户生成推荐列表。在实际应用中,可以根据需要调整相似度计算方法、邻居选择策略等参数。