推荐算法我加进去了,但是不知道哪里的问题,我的算法分析用户相似度时,分析结果就是当前用户和其他用户的相似度都是0.0,根本推不出来。
我觉得第一种可能是计算相似度代码错了,但不知道是不是?我打断点之后,发现disMap是0.0错了,但是userItems和List都是能得到且信息正确
以下是我的代码:
public class CoreMath {
/**
* 计算相关系数并排序
*/
public static Map<Integer, Double> computeNeighbor(Integer key, Map<Integer, List<Associate>> map, int type) {
Map<Integer, Double> distMap = new TreeMap<>();
List<Associate> userItems = map.get(key);
if (CollectionUtil.isNotEmpty(userItems)) {
map.forEach((k, v) -> {
//排除此用户
if (!k.equals(key)) {
//关系系数
double coefficient = relateDist(v, userItems, type);
//关系距离
double distance = Math.abs(coefficient);
distMap.put(k, distance);
}
});
}
return distMap;
}
/**
* 计算两个序列间的相关系数
*/
private static double relateDist(List<Associate> xList, List<Associate> yList, int type) {
List<Integer> xs = new ArrayList<>();
List<Integer> ys = new ArrayList<>();
xList.forEach(x -> yList.forEach(y -> {
if (type == 0) {
if (x.getNotebookId().equals(y.getNotebookId())) {
xs.add(x.getIndex());
ys.add(y.getIndex());
}
} else {
if (x.getUserId().equals(y.getUserId())) {
xs.add(x.getIndex());
ys.add(y.getIndex());
}
}
}));
return getRelate(xs, ys);
}
/**
* 方法描述: 皮尔森相关系数计算
* @param xs x集合
* @param ys y集合
* @Return {@link double}
*/
public static double getRelate(List<Integer> xs, List<Integer> ys) {
int n = xs.size();
//至少有两个元素
if (n < 2) {
return 0D;
}
double Ex = xs.stream().mapToDouble(x -> x).sum();
double Ey = ys.stream().mapToDouble(y -> y).sum();
double Ex2 = xs.stream().mapToDouble(x -> Math.pow(x, 2)).sum();
double Ey2 = ys.stream().mapToDouble(y -> Math.pow(y, 2)).sum();
double Exy = IntStream.range(0, n).m
第二种可能是我的业务代码,收集加权后用户物品关系数据错了,我发现data里面只能存储当前用户的第一组index>1的数据,就没有数据了。
以下是我的代码:
// 定义一个存储每个笔记和每个用户关系的List
List<Associate> data = new ArrayList<>();
// 计算每篇笔记和每个用户之间的关系指数
for (Notebook notebook : allNotebook) {
int index = 1;//遍历笔记
Integer notebookId = notebook.getId();
for (User user : allUsers) {//遍历用户
Integer userId = user.getId();
//指数设置为1
// 1. 判断该用户有没有收藏该商品,收藏的权重:3
Optional<Collect> collectOptional = allCollects.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
if (collectOptional.isPresent()) {
index += 3;
}
// 2. 判断该用户有没有点赞该商品,点赞权重: 1
Optional<Likes> cartOptional = allLikes.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
if (cartOptional.isPresent()) {
index += 1;
}
// 3. 判断该用户有没有评论过笔记,评论的权重: 1
Optional<Comment> commentOptional = allComments.stream().filter(x -> x.getFid().equals(notebookId) && x.getUserId().equals(userId)).findFirst();
if (commentOptional.isPresent()) {
index += 1;
}
if (index > 1) {
Associate associate = new Associate(userId,notebookId,index);
data.add(associate);
}
}
}