[java技术]使用java编写的协同过滤算法
·
博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;
🍅希望对大家有帮助🍅
基础算法信息
public class CollaborativeFiltering {
// 计算两个用户之间的余弦相似度
public static double cosineSimilarity(Map<Integer, Double> user1Ratings, Map<Integer, Double> user2Ratings) {
double dotProduct = 0;
double magnitudeUser1 = 0;
double magnitudeUser2 = 0;
// 找出两个用户都评分过的物品
for (Integer itemId : user1Ratings.keySet()) {
if (user2Ratings.containsKey(itemId)) {
double rating1 = user1Ratings.get(itemId);
double rating2 = user2Ratings.get(itemId);
dotProduct += rating1 * rating2;
magnitudeUser1 += rating1 * rating1;
magnitudeUser2 += rating2 * rating2;
}
}
magnitudeUser1 = Math.sqrt(magnitudeUser1);
magnitudeUser2 = Math.sqrt(magnitudeUser2);
if (magnitudeUser1 == 0 || magnitudeUser2 == 0) {
return 0;
}
return dotProduct / (magnitudeUser1 * magnitudeUser2);
}
// 找到与给定用户最相似的K个用户(邻居)
public static List<Integer> findNearestNeighbors(int targetUserId, Map<Integer, Map<Integer, Double>> userItemRatings, int k) {
Map<Integer, Double> targetUserRatings = userItemRatings.get(targetUserId);
List<Integer> neighborIds = new ArrayList<>();
Map<Integer, Double> similarityScores = new HashMap<>();
// 计算目标用户与其他所有用户的相似度
for (Integer userId : userItemRatings.keySet()) {
if (!userId.equals(targetUserId)) {
Map<Integer, Double> otherUserRatings = userItemRatings.get(userId);
double similarity = cosineSimilarity(targetUserRatings, otherUserRatings);
similarityScores.put(userId, similarity);
}
}
// 按照相似度从高到低排序,选取前K个用户作为邻居
similarityScores.entrySet().stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.limit(k)
.forEach(entry -> neighborIds.add(entry.getKey()));
return neighborIds;
}
// 基于邻居的评分对目标用户进行物品推荐
public static List<Integer> recommendItems(int targetUserId, Map<Integer, Map<Integer, Double>> userItemRatings, int k, int numRecommendations) {
List<Integer> neighborIds = findNearestNeighbors(targetUserId, userItemRatings, k);
Map<Integer, Double> itemScores = new HashMap<>();
// 计算每个物品的推荐得分(基于邻居的评分加权平均等方式,这里简单示例)
for (Integer neighborId : neighborIds) {
Map<Integer, Double> neighborRatings = userItemRatings.get(neighborId);
for (Integer itemId : neighborRatings.keySet()) {
if (!userItemRatings.get(targetUserId).containsKey(itemId)) {
double score = itemScores.getOrDefault(itemId, 0.0);
score += neighborRatings.get(itemId);
itemScores.put(itemId, score);
}
}
}
// 按照推荐得分从高到低排序,选取前numRecommendations个物品作为推荐结果
List<Integer> recommendedItems = new ArrayList<>();
itemScores.entrySet().stream()
.sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
.limit(numRecommendations)
.forEach(entry -> recommendedItems.add(entry.getKey()));
return recommendedItems;
}
}
项目使用
@RequestMapping("listLookMsg")
public void listLookMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {
//先根据用户字段对数据库查询的数据进行分类
QueryWrapper<LookMsg> queryWrapper = new QueryWrapper<LookMsg>();
queryWrapper.groupBy("msg_user_id");
List<LookMsg> listData = lookMsgMapper.selectList(queryWrapper);
// 模拟用户对数据,外层Map的键是用户ID,内层Map的键是推荐的信息ID,值是随机信息
Map<Integer, Map<Integer, Double>> userItemRatings = new HashMap<>();
for (int i = 0; i < listData.size(); i++) {
//通过用户的iD获取某个用户浏览过的商品信息
QueryWrapper<LookMsg> lookWrapper = new QueryWrapper<LookMsg>();
lookWrapper.eq("msg_user_id",listData.get(i).getMsgUserId());
List<LookMsg> listLook = lookMsgMapper.selectList(lookWrapper);
//把获取的商品信息插入到map集合里面去
Map<Integer, Double> userRatings = new HashMap<Integer, Double>();;
for (int a = 0; a< listLook.size();a++) {
userRatings.put(listLook.get(a).getMsgId(),Double.valueOf(listLook.get(a).getMsgId()));
}
userItemRatings.put(listData.get(i).getMsgUserId(),userRatings);
}
int targetUserId = 1;
int k = 10; // 选取的邻居数量
int numRecommendations = 10; // 推荐物品数量
List<Integer> recommendedItems = recommendItems(targetUserId, userItemRatings, k, numRecommendations);
System.out.println("推荐给用户 " + targetUserId + " 的信息是: " + recommendedItems);
List<LookMsg> listResult = new ArrayList<LookMsg>();
for (int i= 0;i<recommendedItems.size();i++){
QueryWrapper<LookMsg> lookWrapper = new QueryWrapper<LookMsg>();
lookWrapper.eq("msg_id",recommendedItems.get(i));
listResult.add(lookMsgMapper.selectList(lookWrapper).get(0));
}
JSONObject jsonmsg = new JSONObject();
jsonmsg.put("repMsg", "ok");
jsonmsg.put("repCode", "666");
jsonmsg.put("data", gsonTools.createGsonString(listResult));
response.getWriter().print(jsonmsg);// 将路径返回给客户端
System.out.println(jsonmsg);
}
谢谢浏览
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻
更多推荐
所有评论(0)