如何构建商品共现频率稀疏矩阵用于交叉销售分析
R实现商品交叉销售共现稀疏矩阵方案
核心逻辑:先构建「购物车-商品」二值稀疏矩阵(行对应购物车ID,列对应商品ID,存在购买关系则值为1,否则为0),再通过矩阵转置乘自身的运算,直接得到商品维度的共现矩阵,非对角线元素即为两个商品共同出现在同一购物车的次数,对角线为单个商品的总出现次数。
方案1:Matrix包原生实现(推荐,适配大数据量)
计算效率高、内存占用低,适合十万级以上购物车数据场景。
# 加载稀疏矩阵包 library(Matrix) # 示例数据 x = data.frame( cart_id = c("1","1","1","2","2","3","4","5","5","6"), product_id = c("A","B","C","D","A","F","G","A","C","F") ) # 将ID转为因子固定索引映射 x$cart_id <- factor(x$cart_id) x$product_id <- factor(x$product_id) # 构建购物车-商品二值稀疏矩阵 cart_prod <- sparseMatrix( i = as.integer(x$cart_id), j = as.integer(x$product_id), x = rep(1, nrow(x)), dimnames = list(levels(x$cart_id), levels(x$product_id)) ) # 矩阵乘法计算共现矩阵 cooccur_mat <- t(cart_prod) %*% cart_prod # 若不需要商品自身的出现次数,可将对角线置0 diag(cooccur_mat) <- 0
运行后得到的稀疏矩阵结果如下,和预期共现次数完全匹配:
7 x 7 sparse Matrix of class "dgCMatrix" A B C D F G A . 1 2 1 . . B 1 . 1 . . . C 2 1 . . . . D 1 . . . . . F . . . . . . G . . . . . .
注:稀疏矩阵中.代表位置值为0
方案2:tidyverse流实现(代码易读,适合小数据量)
通过数据框自连接统计共现次数,逻辑直观,适合熟悉tidyverse语法的场景:
library(tidyverse) library(Matrix) all_prod <- unique(x$product_id) cooccur_df <- x %>% # 同购物车内的商品做全配对 inner_join(x, by = "cart_id", relationship = "many-to-many") %>% # 统计每对商品的共现次数 count(product_id.x, product_id.y, name = "freq") # 转换为稀疏矩阵格式 cooccur_mat <- sparseMatrix( i = as.integer(factor(cooccur_df$product_id.x, levels = all_prod)), j = as.integer(factor(cooccur_df$product_id.y, levels = all_prod)), x = cooccur_df$freq, dimnames = list(all_prod, all_prod) )
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

