协调过滤推荐算法代码java
时间: 2023-06-22 08:42:54 浏览: 44
以下是一个基于用户的协同过滤推荐算法的Java代码实现:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class UserBasedCF {
// 用户-物品评分矩阵
private double[][] data;
public UserBasedCF(double[][] data) {
this.data = data;
}
// 计算用户之间的相似度
private double similarity(int user1, int user2) {
double sum = 0;
int count = 0;
for (int i = 0; i < data[user1].length; i++) {
if (data[user1][i] != 0 && data[user2][i] != 0) {
sum += Math.pow(data[user1][i] - data[user2][i], 2);
count++;
}
}
return count == 0 ? 0 : 1 / (1 + Math.sqrt(sum / count));
}
// 为指定用户推荐物品
public int recommend(int userId, int k) {
Map<Integer, Double> simMap = new TreeMap<>();
for (int i = 0; i < data.length; i++) {
if (i != userId) {
double sim = similarity(userId, i);
if (sim > 0) {
simMap.put(i, sim);
}
}
}
List<Map.Entry<Integer, Double>> simList = new ArrayList<>(simMap.entrySet());
Collections.sort(simList, new Comparator<Map.Entry<Integer, Double>>() {
@Override
public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
return -Double.compare(o1.getValue(), o2.getValue());
}
});
double[] predRatings = new double[data[0].length];
for (int i = 0; i < data[0].length; i++) {
if (data[userId][i] == 0) {
double sum = 0, weightSum = 0;
for (int j = 0; j < k && j < simList.size(); j++) {
int otherUser = simList.get(j).getKey();
double weight = simList.get(j).getValue();
double rating = data[otherUser][i];
if (rating != 0) {
sum += weight * rating;
weightSum += weight;
}
}
if (weightSum != 0) {
predRatings[i] = sum / weightSum;
}
}
}
int maxIndex = 0;
for (int i = 1; i < predRatings.length; i++) {
if (predRatings[i] > predRatings[maxIndex]) {
maxIndex = i;
}
}
return maxIndex;
}
}
```
使用示例:
```java
double[][] data = {
{5, 3, 0, 1},
{4, 0, 4, 4},
{1, 1, 0, 5},
{0, 0, 4, 0},
{5, 4, 3, 1},
{0, 1, 5, 4}
};
UserBasedCF cf = new UserBasedCF(data);
int itemId = cf.recommend(0, 2);
System.out.println(itemId); // 输出:2
```
该代码实现了一个基于用户的协同过滤推荐算法,通过计算用户之间的相似度来预测用户对未评分物品的评分。具体实现中,首先计算每个用户与其他用户的相似度,然后选取相似度最大的k个用户的评分,计算每个未评分物品的预测评分,并返回预测评分最高的物品。