linux环境变量PATH设置错误恢复

背景

一个刚入职小弟,添加环境变量PATH时,之前的PATH没有加上,导致系统命令不能用

解决

环境变量可以理解为把一些可执行程序,添加为命令,从bash可以直接调用;如果bash下不能调用则从安装目录也可以执行,因此按照这个思路进行恢复
1、/usr/bin/vim ~/.bashrc修改PATH,把系统命令添加export PATH=$PATH:/usr/bin:/usr/local/bin:/bin:/sbin
2、locate source ~/.bashrc
一开始source命令找了半天安装目录没找到,后来采用locate命令执行,恢复OK。

package com.shanzhu.tourism.utils.recommend; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import com.google.common.collect.Lists; import com.shanzhu.tourism.utils.recommend.dto.RelateDTO; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * 推荐算法 * * @author: ShanZhu * @date: 2024-07-25 */ public class CoreMath { /** * 推荐计算 */ public List<String> recommend(String userId, List<RelateDTO> list) { //找到最近邻用户id Map<Double, String> distances = computeNearestNeighbor(userId, list); if(MapUtil.isEmpty(distances)){ return Collections.EMPTY_LIST; } //取出相似度最近的用户id String nearest = distances.values().iterator().next(); Iterator<String> iterator = distances.values().iterator(); while (iterator.hasNext()) { nearest = iterator.next(); } Map<String, List<RelateDTO>> userMap = list.stream().collect(Collectors.groupingBy(RelateDTO::getUserId)); //最近邻用户涉及的业务id列表 List<String> neighborItemList = userMap.get(nearest).stream().map(e -> e.getProductId()).collect(Collectors.toList()); //当前用户涉及的业务id列表 List<String> userItemList = userMap.get(userId).stream().map(e -> e.getProductId()).collect(Collectors.toList()); //找到最近邻买过,但是该用户没涉及过的,计算推荐,放入推荐列表 List<String> recommendList = new ArrayList<>(); for (String item : neighborItemList) { if (!userItemList.contains(item)) { recommendList.add(item); } } Collections.sort(recommendList); return recommendList; } /** * 在给定userId的情况下,计算其他用户和它的相关系数并排序 */ private Map<Double, String> computeNearestNeighbor(String userId, List<RelateDTO> list) { //对同一个用户id数据,做分组 Map<String, List<RelateDTO>> userMap = list.stream().collect(Collectors.groupingBy(RelateDTO::getUserId)); //treemap是从小到大排好序的
最新发布
04-03
<think>好的,用户想了解Java推荐算法的实现细节和优化方法,特别是使用Hutool、Guava和Stream API。首先,我需要整理推荐算法的基本概念和常见类型,比如协同过滤、基于内容的推荐等。然后结合Java的具体实现,分析如何利用这些工具库来优化代码。 首先,推荐算法的基础是协同过滤,分为用户协同和物品协同。用户可能想知道如何用Java实现这些算法。例如,计算用户相似度可以用余弦相似度或皮尔逊相关系数,这里可以用Java的数据结构如Map来存储用户评分,用Stream API来处理数据,简化代码。 接下来,实现细节方面,数据预处理是关键。Hutool提供了文件读取工具,可以快速加载数据集。Guava的Multiset或Multimap可能用于存储用户-物品的交互数据。比如,用Multimap来记录每个用户评分过的物品,这样查询时更高效。 然后是核心算法实现。用户协同过滤需要计算用户之间的相似度,这里可以用嵌套循环遍历用户,但这样效率不高。优化的话,可能需要并行处理,Java的Stream API的parallel()方法可以在这里派上用场,利用多核处理器加速计算。 在优化方法部分,缓存是重点。Guava的LoadingCache可以缓存用户相似度计算结果,避免重复计算。对于实时推荐,增量计算可能更有效,比如只更新受影响的部分,而不是全部重新计算。此外,矩阵分解如SVD,可以用并行矩阵运算库,比如使用并行流来加速矩阵操作。 工具库方面,Hutool的FileUtil和Log可以简化IO和日志记录,Guava的集合工具能优化数据结构,Stream API使代码更简洁。例如,使用Stream的filter和collect来处理数据集合,减少样板代码。 性能方面,要注意算法复杂度,比如用户协同过滤是O(),大数据下可能不适用,可能需要分治或近似算法。内存优化方面,使用稀疏数据结构存储评分矩阵,避免内存浪费。 最后,用户可能对如何具体整合这些库到推荐系统中感兴趣,比如示例代码展示如何使用Hutool读取数据,Guava处理集合,Stream API进行并行计算。同时,需要提醒用户根据数据规模选择合适的算法和优化策略,比如小数据用协同过滤,大数据则考虑矩阵分解或深度学习模型。 总结,回答需要涵盖推荐算法的基础、Java实现的具体步骤、各工具库的应用场景,以及优化策略,确保结构清晰,帮助用户逐步理解和实现。</think>### Java推荐算法实现优化指南 #### 一、推荐算法基础实现 1. **协同过滤算法** - **用户协同过滤**:通过计算用户相似度(如余弦相似度$similarity = \frac{\sum (u_i \cdot v_i)}{\sqrt{\sum u_i^2} \cdot \sqrt{\sum v_i^2}}$)推荐相似用户偏好的物品 - **物品协同过滤**:基于物品相似度矩阵(如Jaccard系数$J(A,B) = \frac{|A \cap B|}{|A \cup B|}$)进行推荐 2. **基于内容的推荐** 使用TF-IDF算法计算文本特征向量: $$ TF(t) = \frac{\text{词t在文档中出现的次数}}{\text{文档总词数}} $$ $$ IDF(t) = \log \frac{\text{总文档数}}{\text{包含词t的文档数}} $$ #### 二、Java实现细节 1. **数据预处理** ```java // Hutool读取CSV数据 List<String> lines = FileUtil.readLines("data.csv", StandardCharsets.UTF_8); // Guava构建稀疏矩阵 Table<Integer, Integer, Double> ratingMatrix = HashBasedTable.create(); ``` 2. **核心算法实现** ```java // 计算用户相似度(Stream API实现) Map<Integer, Map<Integer, Double>> similarityMatrix = userList.parallelStream() .collect(Collectors.toMap( u -> u.id, u -> userList.stream() .filter(v -> !v.equals(u)) .collect(Collectors.toMap( v -> v.id, v -> cosineSimilarity(u.ratings, v.ratings) )) )); ``` #### 三、优化方法 1. **性能优化** - **缓存机制**(Guava LoadingCache): ```java LoadingCache<Integer, List<RecommendItem>> cache = CacheBuilder.newBuilder() .maximumSize(1000) .build(new CacheLoader<>() { public List<RecommendItem> load(Integer userId) { return calculateRecommendations(userId); } }); ``` - **矩阵分解优化**(SVD加速): ```java Matrix factorization = new Matrix(userCount, featureCount); factorization.parallelStream().forEach(row -> updateFeatures(row)); ``` 2. **代码优化** - **Hutool工具链**: ```java // 快速构建JSON响应 JSONObject res = JSONUtil.createObj() .set("code", 200) .set("data", recommendList); ``` - **Stream API并行处理**: ```java List<RecommendItem> topN = itemScores.entrySet().parallelStream() .sorted(Comparator.comparingDouble(e -> -e.getValue())) .limit(10) .map(e -> new RecommendItem(e.getKey(), e.getValue())) .collect(Collectors.toList()); ``` #### 四、工具库整合 | 工具库 | 应用场景 | 示例方法 | |-----------|-----------------------------|--------------------------| | Hutool | 数据读取/JSON处理 | FileUtil, JSONUtil | | Guava | 集合优化/缓存 | Multimap, LoadingCache | | Stream API | 数据管道/并行计算 | filter, map, collect | #### 五、性能对比指标 1. **准确率**:查准率$P = \frac{TP}{TP+FP}$ 2. **召回率**:$R = \frac{TP}{TP+FN}$ 3. **响应时间**:90%请求<200ms(需JVM调优)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值