基于用户的协同过滤算法的Java代码
时间: 2023-10-20 10:17:50 浏览: 40
以下是基于用户的协同过滤算法的Java代码示例:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserBasedCF {
// 用户评分数据,key为用户id,value为用户评分数据
private Map<String, Map<String, Double>> userRatings;
public UserBasedCF(Map<String, Map<String, Double>> userRatings) {
this.userRatings = userRatings;
}
// 计算用户之间的相似度
public Map<String, Double> getSimilarity(String userId) {
Map<String, Double> similarity = new HashMap<>();
Map<String, Double> userRating = userRatings.get(userId);
for (String otherUserId : userRatings.keySet()) {
if (!otherUserId.equals(userId)) {
Map<String, Double> otherUserRating = userRatings.get(otherUserId);
double dotProduct = 0;
double norm1 = 0;
double norm2 = 0;
for (String itemId : userRating.keySet()) {
if (otherUserRating.containsKey(itemId)) {
dotProduct += userRating.get(itemId) * otherUserRating.get(itemId);
norm1 += Math.pow(userRating.get(itemId), 2);
norm2 += Math.pow(otherUserRating.get(itemId), 2);
}
}
if (norm1 == 0 || norm2 == 0) {
similarity.put(otherUserId, 0.0);
} else {
similarity.put(otherUserId, dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2)));
}
}
}
return similarity;
}
// 为用户推荐物品
public List<String> recommend(String userId, int n) {
Map<String, Double> similarity = getSimilarity(userId);
List<String> recommended = new ArrayList<>();
Map<String, Double> scores = new HashMap<>();
for (String otherUserId : similarity.keySet()) {
if (similarity.get(otherUserId) > 0) {
Map<String, Double> otherUserRating = userRatings.get(otherUserId);
for (String itemId : otherUserRating.keySet()) {
if (!userRatings.get(userId).containsKey(itemId)) {
if (!scores.containsKey(itemId)) {
scores.put(itemId, 0.0);
}
scores.put(itemId, scores.get(itemId) + otherUserRating.get(itemId) * similarity.get(otherUserId));
}
}
}
}
List<Map.Entry<String, Double>> sortedScores = new ArrayList<>(scores.entrySet());
sortedScores.sort(Map.Entry.comparingByValue());
for (int i = sortedScores.size() - 1; i >= Math.max(sortedScores.size() - n, 0); i--) {
recommended.add(sortedScores.get(i).getKey());
}
return recommended;
}
}
```
使用示例:
```java
Map<String, Map<String, Double>> userRatings = new HashMap<>();
Map<String, Double> user1Ratings = new HashMap<>();
user1Ratings.put("item1", 3.0);
user1Ratings.put("item2", 4.0);
user1Ratings.put("item3", 5.0);
userRatings.put("user1", user1Ratings);
Map<String, Double> user2Ratings = new HashMap<>();
user2Ratings.put("item2", 4.0);
user2Ratings.put("item3", 5.0);
user2Ratings.put("item4", 2.0);
userRatings.put("user2", user2Ratings);
Map<String, Double> user3Ratings = new HashMap<>();
user3Ratings.put("item1", 2.0);
user3Ratings.put("item3", 5.0);
user3Ratings.put("item5", 4.0);
userRatings.put("user3", user3Ratings);
UserBasedCF userBasedCF = new UserBasedCF(userRatings);
System.out.println(userBasedCF.getSimilarity("user1"));
System.out.println(userBasedCF.recommend("user1", 2));
```
输出结果:
```
{user2=0.9486832980505138, user3=0.7001400420149166}
[item4, item1]
```