Cosine similarity能否用于数值、分类等非文本数据?附超市客户场景问题
余弦相似度计算购物数据相似度的方案及拓展方法
余弦相似度的适用范围
余弦相似度本身支持数值型数据的相似度计算,分类型数据无法直接代入,需要先经过编码处理转换为数值向量后即可使用。
针对你的超市购物数据的具体实现步骤
第一步:数据预处理
你的样例数据如下:
CustID Gender online milk bread egg diapers 234 1 1 0 1 1 0 235 2 1 0 1 0 0 234 1 0 1 0 0 1 234 1 0 0 1 0 1 238 3 0 0 0 0 0 239 1 0 1 1 0 1 240 2 1 0 0 1 1
- 分类型字段
Gender是无序分类,不能直接用1/2/3的数值计算,会引入错误的顺序权重,需要做独热编码:Gender=1转为[1,0,0]、Gender=2转为[0,1,0]、Gender=3转为[0,0,1] - 其余
online/milk/bread等int64类型的二值字段可以直接作为向量维度使用 - 最终单条购物记录会被转为8维数值向量,比如第一条234的记录对应向量为
[1,0,0,1,0,1,1,0]
第二步:余弦相似度计算
余弦相似度的计算公式为:cosθ = (A·B) / (||A|| × ||B||)
其中A·B是两个向量的点积,||A||、||B||分别是两个向量的模长,计算结果取值范围为[-1,1],数值越接近1代表两条记录的相似度越高。
同一客户多条记录的相似度计算方案
针对类似CustID=234有3条购物记录的情况,按你的需求可以选两种处理方式:
- 若要对比单条购物行为的相似性:直接提取该客户的所有记录对应的向量,两两计算余弦相似度即可。比如234的第一条线上买面包鸡蛋的记录,和第二条线下买牛奶尿布的记录,计算出来的相似度约为0.29,说明两次购物行为差异很大
- 若要对比客户整体消费行为的相似性:先对单个客户的所有记录做聚合,生成用户级的统计向量(比如统计该用户线上消费次数占比、各商品的购买次数、性别编码),再用聚合后的向量计算余弦相似度
其他适用的相似度计算方法推荐
- 杰卡德相似度:最适配你当前的二值特征为主的场景,计算两个向量共同为1的维度占所有至少有一个为1的维度的比例,对二值特征的相似性判断比余弦相似度更准确
- 汉明距离:统计两个向量对应位置取值不同的数量,数量越少相似度越高,适合分类特征占比更高的数据集
- 欧氏距离:如果后续加入消费金额、购买数量等非二值的数值特征,欧氏距离可以直观衡量两个向量的空间差异,也可以转换为相似度指标使用
- 皮尔逊相关系数:如果需要衡量消费行为的趋势一致性(比如两个用户是否都是线上偏好购买食品、线下偏好购买日用品),皮尔逊系数比余弦相似度更适配这类需求
内容的提问来源于stack exchange,提问作者Sajid
相关产品推荐
相关产品推荐

