UserCF java实现
时间: 2023-11-18 12:07:32 浏览: 37
UserCF是一种基于用户的协同过滤算法,可以用于推荐系统。下面是一个简单的Java实现示例:
1.首先,我们需要定义一个User类来存储用户信息,包括用户ID和评分列表:
```java
public class User {
private int userId;
private Map<Integer, Double> ratings;
public User(int userId) {
this.userId = userId;
ratings = new HashMap<>();
}
public int getUserId() {
return userId;
}
public void setRating(int itemId, double rating) {
ratings.put(itemId, rating);
}
public Double getRating(int itemId) {
return ratings.get(itemId);
}
public Set<Integer> getRatedItems() {
return ratings.keySet();
}
}
```
2.然后,我们需要定义一个UserCF类来计算用户相似度和进行推荐:
```java
public class UserCF {
private List<User> users;
public UserCF(List<User> users) {
this.users = users;
}
// 计算用户相似度
public double similarity(User u1, User u2) {
Set<Integer> commonItems = new HashSet<>(u1.getRatedItems());
commonItems.retainAll(u2.getRatedItems());
if (commonItems.size() == 0) {
return 0;
}
double sum1 = 0, sum2 = 0, sum3 = 0;
for (int itemId : commonItems) {
double r1 = u1.getRating(itemId);
double r2 = u2.getRating(itemId);
sum1 += r1 * r2;
sum2 += r1 * r1;
sum3 += r2 * r2;
}
return sum1 / (Math.sqrt(sum2) * Math.sqrt(sum3));
}
// 推荐物品
public List<Integer> recommend(User user, int n) {
Map<Integer, Double> scores = new HashMap<>();
for (User other : users) {
if (other.getUserId() == user.getUserId()) {
continue;
}
double sim = similarity(user, other);
if (sim <= 0) {
continue;
}
for (int itemId : other.getRatedItems()) {
if (user.getRating(itemId) != null) {
continue;
}
double score = sim * other.getRating(itemId);
scores.put(itemId, scores.getOrDefault(itemId, 0.0) + score);
}
}
List<Integer> result = new ArrayList<>(scores.keySet());
result.sort((i1, i2) -> Double.compare(scores.get(i2), scores.get(i1)));
return result.subList(0, Math.min(n, result.size()));
}
}
```
3.最后,我们可以使用UserCF类来进行推荐:
```java
public class Main {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User user1 = new User(1);
user1.setRating(1, 4.0);
user1.setRating(2, 3.0);
user1.setRating(3, 5.0);
users.add(user1);
User user2 = new User(2);
user2.setRating(2, 4.0);
user2.setRating(3, 3.0);
user2.setRating(4, 5.0);
users.add(user2);
User user3 = new User(3);
user3.setRating(1, 5.0);
user3.setRating(2, 2.0);
user3.setRating(4, 4.0);
users.add(user3);
UserCF userCF = new UserCF(users);
List<Integer> items = userCF.recommend(user1, 2);
System.out.println(items);
}
}
```
在上面的示例中,我们创建了三个用户,每个用户评分了一些物品。然后,我们使用UserCF类来计算用户相似度并进行推荐。在这个例子中,我们将向用户1推荐两个物品。