【推荐算法】协同过滤算法——基于用户 Java实现

只是简单谢了一个Demo,先贴上GitHub地址。
https://github.com/wang135139/recommend-system

基本概念就不过多介绍了,相信能看明白的都了解。如果想了解相关推荐先做好知识储备:
1.什么事推荐算法
2.什么是基于邻域的推荐算法

笔者选用的是GroupLens的MoviesLens数据
传送门GroupLens

数据集处理

此处截取数据 UserId + MovieId 作为隐反馈数据。个人的实现方式并不是很好,之后再考虑优化,如果有好的想法欢迎小纸条。
基本设置项目结构如下:


    /project
        /analyzer --推荐分析
            -CollaborativeFileringanalyzer
        /bean --数据元组
            -BasicBean
            -HabitsBean
        /input --输入设置
            -ReaderFormat
        /recommender --推荐功能
            -UserRecommender

首先思路是截取MovieLens数据,转化为格式化的书籍格式。MovieLens数据基本格式为

| user id | item id | rating | timestamp |

读取后的数据为表结构,实际可以用 Map 或者 二维数组 进行存储。
考虑到之后转化的问题,决定用二维数组。

设置BasicBean用于存储表结构中的行,主要设置List < String >用于存储一行数据中的单项数据

    /**
     * A row of data sets describes in witch the parameters are included.
     * 
     * @author wqd 
     * 2016/01/18
     */
    public class BasicBean {
   
        private List<String> parameters;
    //  private int num;
        private boolean tableHead;

        ///Default constructor,the row set n floders and is or not a table head
        public BasicBean(boolean head) {
           
  • 8
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
协同过滤算法是一种推荐系统算法,它通过分析用户的历史行为,比如购买记录、评分记录等,来推荐用户可能感兴趣的产品或内容。其中基于用户点赞的协同过滤算法是一种常见的算法Java实现基于用户点赞的协同过滤算法可以分为以下几个步骤: 1. 数据准备 首先需要准备用户点赞数据,可以从数据库或文件中读取。数据格式应该包含用户ID和点赞的内容ID。 2. 数据处理 将用户点赞数据转换成用户-内容矩阵,矩阵的行表示用户,列表示内容,矩阵中的每个元素表示用户对内容的点赞情况。矩阵中未点赞的位置可以用0或其他值表示。 3. 相似度计算 计算用户之间的相似度,常见的计算方法有余弦相似度和皮尔逊相关系数。可以使用公式或Java库函数计算相似度。 4. 推荐生成 根据相似度矩阵和用户点赞数据,生成推荐结果。可以使用加权平均或其他推荐算法生成推荐结果。 以下是一个简单的Java实现示例: ```java import java.util.HashMap; import java.util.Map; public class CollaborativeFiltering { // 用户点赞数据 private static int[][] userLikes = { {1, 2}, {1, 3, 4}, {2, 3}, {2, 4}, {3, 5}, {4, 5} }; public static void main(String[] args) { // 计算用户-内容矩阵 int[][] userContentMatrix = getUserContentMatrix(userLikes); // 计算用户之间的相似度矩阵 double[][] similarityMatrix = getSimilarityMatrix(userContentMatrix); // 生成推荐结果 Map<Integer, Double> recommendations = getRecommendations(0, userLikes, similarityMatrix); System.out.println(recommendations); } // 将用户点赞数据转换成用户-内容矩阵 private static int[][] getUserContentMatrix(int[][] userLikes) { int maxContentId = 0; for (int[] likes : userLikes) { for (int contentId : likes) { if (contentId > maxContentId) { maxContentId = contentId; } } } int[][] userContentMatrix = new int[userLikes.length][maxContentId]; for (int i = 0; i < userLikes.length; i++) { for (int contentId : userLikes[i]) { userContentMatrix[i][contentId - 1] = 1; } } return userContentMatrix; } // 计算用户之间的相似度矩阵 private static double[][] getSimilarityMatrix(int[][] userContentMatrix) { int numUsers = userContentMatrix.length; double[][] similarityMatrix = new double[numUsers][numUsers]; for (int i = 0; i < numUsers; i++) { for (int j = 0; j < numUsers; j++) { if (i == j) { similarityMatrix[i][j] = 1.0; } else { double dotProduct = 0.0; double norm1 = 0.0; double norm2 = 0.0; for (int k = 0; k < userContentMatrix[i].length; k++) { dotProduct += userContentMatrix[i][k] * userContentMatrix[j][k]; norm1 += Math.pow(userContentMatrix[i][k], 2); norm2 += Math.pow(userContentMatrix[j][k], 2); } similarityMatrix[i][j] = dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2)); } } } return similarityMatrix; } // 生成推荐结果 private static Map<Integer, Double> getRecommendations(int userId, int[][] userLikes, double[][] similarityMatrix) { Map<Integer, Double> recommendations = new HashMap<>(); int[] userLikesArray = userLikes[userId]; for (int contentId = 1; contentId <= userLikesArray.length; contentId++) { if (userLikesArray[contentId - 1] == 0) { double weightedSum = 0.0; double weightSum = 0.0; for (int i = 0; i < userLikes.length; i++) { if (i != userId && userLikes[i][contentId - 1] == 1) { weightedSum += similarityMatrix[userId][i]; weightSum += similarityMatrix[userId][i]; } } if (weightSum > 0.0) { recommendations.put(contentId, weightedSum / weightSum); } } } return recommendations; } } ``` 该示例中,用户点赞数据用二维数组`userLikes`表示,计算用户-内容矩阵用函数`getUserContentMatrix`实现,计算用户之间的相似度矩阵用函数`getSimilarityMatrix`实现,生成推荐结果用函数`getRecommendations`实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值