1. 基于用户协同过滤的智能推荐系统实战
最近在电商项目中实现了一套用户协同过滤推荐系统,相比传统的内容推荐算法,这种基于用户行为的推荐方式在实际业务中表现出了更好的转化率。核心思路很简单:如果用户A和用户B购买记录高度相似,那么A买过但B没买的商品,就很可能会引起B的兴趣。
1.1 系统架构设计
整个系统采用经典的三层架构:
- 前端:JSP+JSTL实现动态页面渲染
- 后端:SpringBoot 2.7 + MyBatis 3.5
- 数据层:MySQL 8.0 + Redis 6.2
特别在数据存储设计上做了分层处理:
- 实时用户行为数据存MySQL
- 用户相似度矩阵存Redis
- 商品基础信息走本地缓存
提示:Redis选用Hash结构存储用户相似度关系,Key设计为"similarity:用户ID",Field为相似用户ID,Value为相似度分数。这种结构在查询时可以直接用hgetall命令获取全部相似用户。
1.2 核心算法实现
用户协同过滤的核心是相似度计算,我们采用改进的余弦相似度算法。传统余弦相似度在电商场景有两个问题:
- 热门商品会导致相似度失真
- 用户行为稀疏时计算不准确
我们的解决方案:
java复制public double enhancedCosineSimilarity(List<Integer> user1Items,
List<Integer> user2Items,
Map<Integer, Double> itemPopularity) {
Set<Integer> intersection = new HashSet<>(user1Items);
intersection.retainAll(user2Items);
// 加入流行度惩罚因子
double denominator = user1Items.stream()
.mapToDouble(item -> 1/Math.log(1+itemPopularity.get(item)))
.sum();
denominator *= user2Items.stream()
.mapToDouble(item -> 1/Math.log(1+itemPopularity.get(item)))
.sum();
return intersection.size() / Math.sqrt(denominator);
}
这个改进版算法有三个关键点:
- 使用HashSet快速计算物品交集
- 对热门商品加入对数惩罚因子
- 对稀疏数据采用Jaccard相似度兜底
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工程实现关键细节
2.1 数据存储设计
用户行为表是推荐系统的基石,我们的设计考虑了三种行为类型:
sql复制CREATE TABLE `user_behavior` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL COMMENT '用户ID',
`item_id` int NOT NULL COMMENT '商品ID',
`behavior_type` tinyint NOT NULL COMMENT '1浏览 2收藏 3加购 4购买',
`behavior_weight` decimal(3,2) DEFAULT '1.00' COMMENT '行为权重',
`timestamp` bigint NOT NULL COMMENT '行为时间戳',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_item` (`user_id`,`item_id`),
KEY `idx_user_time`
