基于协同过滤的用户推荐的java例子

本文介绍了一种基于用户的协同过滤推荐算法,通过计算用户间的相似度并推荐相似用户喜爱的项目,实现了个性化推荐功能。文章详细解释了算法流程,包括用户-项目评分矩阵的构建、用户相似度计算及推荐结果评估等。
### 基于协同过滤的用户推荐的java例子

#####  基于用户的协同过滤推荐算法


1. 基于用户的协同过滤推荐算法
2. 基于用户的协同过滤推荐算法通过寻找与目标用户具有相似评分的邻居用户,
通过查找邻居用户喜欢的项目,推测目标用户也具有相同的喜好。
基于用户的协同过滤推荐算法基本思想是:根据用户-项目评分矩阵查找当前用户的最近邻居,
利用最近邻居的评分来预测当前用户对项目的预测值,将评分最高的N个项目推荐给用户,
其中的项目可理解为系统处理的商品。其算法流程图如下图1所示。
3.
4.
![Image text](./image/recommend-process1.png)



#####  基于用户的协同过滤推荐算法实现步骤为

1. 实时统计user对item的打分,从而生成user-item表(即构建用户-项目评分矩阵);
2. 计算各个user之间的相似度,从而生成user-user的得分表,并进行排序;
3. 对每一user的item集合排序;
4. 针对预推荐的user,在user-user的得分表中选择与该用户最相似的N个用户,并在user-item表中选择这N个用户中已排序好的item集合中的topM;
5. 此时的N*M个商品即为该用户推荐的商品集。



##### 基于用户的协同过滤推荐算法实现步骤为

   
  实时统计user对item的打分,从而生成user-item表(即构建用户-项目评分矩阵);
  计算各个user之间的相似度,从而生成user-user的得分表,并进行排序;
SpliteFileAndMakeScoreTable

  对每一user的item集合排序;ReduceFileTest

  针对预推荐的user,在user-user的得分表中选择与该用户最相似的N个用户,并在user-item表中选择这N个用户中已排序好的item集合中的topM;
PredictTest

  此时的N*M个商品即为该用户推荐的商品集。


##### 例子步骤代码讲解


##### 1.SpliteFileAndMakeScoreTable


1. 输入训练数据train.csv。
2. 按照userId生产文件,统计每个用户输出对应的userId,itemId,动作类型(对item操作类型),操作次数。
3. 动作类型对应:包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4。
4. 生成用户对item访问权重,动作类型映射权重值 。
5. 根据两用户的相同item的权重矩阵,来求两用户的相似度,生产文件score。
   
##### 2.ReduceFileTest


1. 把用户文件根据点击type,次数得到权重,按照权重值进行排序。
2. 类似上面的步骤3,4。

##### 3.PredictTest

1. 输入ReduceFileTest生成用户排序文件与第一步生成的用户间相似度文件。
2. 循环用户间相似度score文件,每个用户找相似度前5的用户对应权重前5的Items
3. 生成对应的文件predict。




##### 5.MatchTest2

    
    最近读到推荐系统中的TopN推荐,它的预测准确率一般是通过准确率和召回率来进行评估的,那么我们就要理解,什么是准确率,什么是召回率!
    
    准确率,顾名思义,就是准确程度。通过正确数/总数得到。而正确数是什么,总数是什么呢?
    
    召回率,我们可以理解为找到的数目与总的需要我们找到的数目的比,那在推荐系统中,什么是找到的数目,什么是需要我们总的找到的数目呢?
    
    精确率是针对我们 预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。
    而 召回率是针对我们 原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。
    
    其实就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。但分子都是表示预测的正样本与原来正样本的交集


1. 详细讲解下本例子中的, 分子都是表示预测的正样本与原来正样本的交集;这里统计的是所有用户推荐值与实际值(就是指所有user文件中的items数量)的交集;
2. 统计准确率=上面的分子/预测推荐列表(predict里面的数量)
3. 召回率=上面的分子/真实样本值(所有样本userId对应的items数量)
4. F值
5. 更多关于准确率,召回率 https://blog.youkuaiyun.com/u013599298/article/details/60592095

```
推荐用户items:966
真实样本的items数量:30926
统计的真实值:228
precision=23.60248447204969%,recall=0.737243743128759%,f1=1.4298256616079268

```

##### 代码例子

1. https://github.com/andrexuDeveloper/recommendSystem.git
2.
3.

### 构建基于协同过滤推荐系统的概述 为了实现一个基于协同过滤推荐系统,可以采用两种主要方法:基于用户协同过滤和基于物品的协同过滤。这两种方式都依赖于收集到的用户行为数据以及用户和项目的属性信息[^1]。 对于基于Java的开发环境而言,构建这样的系统通常涉及以下几个方面: - 数据预处理 - 计算相似度矩阵 - 预测评分并生成推荐列表 下面是一个简单的例子来展示如何利用Java创建一个基本版本的基于用户协同过滤算法。 ### 实现步骤 #### 准备工作 确保已经安装了JDK,并配置好了IDE(如IntelliJ IDEA 或 Eclipse)。此外,还需要引入一些必要的库用于数值计算,比如Apache Commons Math3。 #### 加载数据集 假设有一个CSV文件包含了三列:`userId`, `movieId`, 和 `rating`. 这些构成了训练模型所需的数据基础[^2]. ```java import java.io.BufferedReader; import java.io.FileReader; import java.util.HashMap; import java.util.Map; public class DataLoader { public static Map<Integer, Map<Integer, Double>> loadRatings(String filePath) throws Exception { BufferedReader br = new BufferedReader(new FileReader(filePath)); String line; Map<Integer, Map<Integer, Double>> ratings = new HashMap<>(); while ((line = br.readLine()) != null){ String[] tokens = line.split(","); int userId = Integer.parseInt(tokens[0]); int movieId = Integer.parseInt(tokens[1]); double rating = Double.parseDouble(tokens[2]); ratings.computeIfAbsent(userId, k -> new HashMap<>()).put(movieId, rating); } return ratings; } } ``` #### 创建UserCF类 此部分实现了核心逻辑——即通过余弦相似度找到最近邻用户,并据此预测目标用户可能感兴趣的项目。 ```java import org.apache.commons.math3.linear.RealVector; import org.apache.commons.math3.linear.ArrayRealVector; class UserCF { private final Map<Integer, RealVector> userVectors; // 用户向量表示 public UserCF(Map<Integer, ? extends Map<Integer, ?>> rawRatings) { this.userVectors = convertToVectors(rawRatings); } /** * 将原始评分转换成稀疏向量形式. */ private Map<Integer, RealVector> convertToVectors(Map<Integer, ? extends Map<Integer, ?>> rawData) { ... } /** * 使用余弦距离衡量两个用户之间的相似程度. */ public double cosineSimilarity(int u1, int u2) { RealVector v1 = userVectors.get(u1), v2 = userVectors.get(u2); if (v1 == null || v2 == null) throw new IllegalArgumentException("Invalid user id"); return v1.dotProduct(v2).divide(v1.getNorm() * v2.getNorm()); } /** * 获取给定用户的K个最接近邻居. */ public List<Integer> getNearestNeighbors(int targetUserId, int K) { ... } /** * 对指定的目标用户进行个性化推荐. */ public Set<Integer> recommendItemsForUser(int targetUserId, int numRecommendations) { ... } } ``` 请注意上述代码片段仅作为概念验证用途,在实际部署前还需考虑更多细节优化,例如性能调优、异常处理等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值