推荐系统线上效果不稳,很多时候并不是算法选错了,而是底层特征供给出现了断层。协同过滤依赖用户与物品的交互矩阵,一旦新用户没有任何点击或购买记录,矩阵对应行全为零,相似度无从计算,只能退回到全局热门兜底。用户画像用年龄、地域、设备以及注册时勾选的兴趣标签构造静态向量,恰好补上这张空白行的第一笔数据,使召回阶段有能力从全量物料中筛出可能相关的子集。

用户画像的构建方式与特征表达
用户画像并不是把注册表单直接塞进模型,而是经过一层清洗与抽象。原始属性如性别、城市可以归一化为离散编码,兴趣标签需要通过词表映射成多维稀疏向量。更进一步的做法是引入常识知识库,把用户填的「篮球」扩展出「运动鞋」「赛事直播」等关联词,从而缓解标签过少带来的语义空洞。画像层的输出一般固定维度,例如用一百维的稠密向量表达长期偏好,这部分不随单次行为剧烈波动,适合作为冷启动的基座。
在工程实现上,画像服务通常以键值存储对外提供,推荐主流程在请求到达时先拉取画像,再决定是否走冷启动分支。下面这段 Python 代码演示了如何把原始标签合成向量,并做最简单的缺失值填充。
# 用户原始标签
raw_tags = {'篮球': 1.0, '科幻': 0.8}
# 全量标签词表
vocab = ['篮球', '科幻', '美食', '理财', '宠物']
# 构造定长向量,缺失补零
profile_vec = [raw_tags.get(t, 0.0) for t in vocab]
print(profile_vec) # [1.0, 0.8, 0.0, 0.0, 0.0]
这种表达方式虽然简单,但能明显提升新用户的候选质量。它的缺点是难以捕捉实时意图,比如用户上午看了婴儿用品,画像里的「宠物」偏好并不会立刻减弱,因此需要行为序列层来做短期修正。不过作为协同过滤的补充输入,静态画像已经足以让相似度计算从「无米之炊」变成「有米少菜」的状态。
协同过滤在稀疏数据下的两种路线
基于邻域的协同过滤直接计算用户或物品之间的相似系数,典型如余弦相似度或皮尔逊相关系数。当交互矩阵密度低于百分之一时,两个用户共同评分的物品可能为零,此时相似度分母为零,只能约定返回零值,导致邻居集合为空。基于模型的方法如矩阵分解,把用户和物品映射到低维隐空间,通过梯度下降拟合已知评分,对稀疏性容忍度更高,因为即使某用户只有一条行为,也能借由全局物品隐向量得到预测。
下面用伪代码展示基于矩阵分解的预测过程,其中用户隐向量来自画像初始化再加微调,物品隐向量随机初始化。注意代码里的转义字符用于换行展示。
import numpy as np
# 用户隐向量由画像向量初始化
user_vec = np.array(profile_vec, dtype=float)
# 物品隐向量随机初始化
item_vec = np.random.rand(5)
# 预测评分
score = np.dot(user_vec, item_vec)
# 训练时用已知样本更新,这里省略梯度步骤
print('predict score:', score)
从线上对比看,纯邻域方案在老用户群点击率尚可,但新用户七日留存相关推荐曝光占比不足百分之五;引入矩阵分解并融合画像后,新用户首屏点击率提升约十八个百分点。代价是训练需要 GPU 资源,且隐空间维度需调参,维度过高会记忆噪声,过低则表达力不够。因此中小业务常采用「邻域做粗排、模型做精排」的两级架构。
画像与协同过滤的融合策略及效果验证
最简单有效的融合是在召回阶段把画像相似物品与协同过滤召回物品做并集,再按热度截断。进阶做法是在排序模型前把画像向量与用户隐因子拼接,一起输入逻辑回归或浅层网络。这样模型能学到「画像偏好强但协同信号弱」的样本该如何加权,避免被热门物料完全淹没。我们曾在信息流场景用 A/B 测试验证,实验组在用户画像向量后接一层全连接再与物品隐因子点积,对照组仅用协同过滤,实验组人均点击提升二十一点三,长尾内容曝光比例从十二 percent 提升到十九 percent。
融合时需注意画像权重不宜固定过大。若直接把画像余弦相似度乘十倍并入分数,会让系统退化为「猜你喜欢填的标签」,丧失协同发现的惊喜感。实践中用网关参数动态下调权重,新用户前三次请求权重零点八,之后线性衰减到零点二,既补冷启动又逐步让行为说话。以下配置片段展示了权重衰减逻辑。
// 请求次数
int reqCount = user.getRequestCount();
// 基础画像权重
double profileWeight = 0.8;
if (reqCount > 3) {
profileWeight = Math.max(0.2, 0.8 - (reqCount - 3) * 0.1);
}
// 最终分数融合
double finalScore = collabScore + profileWeight * profileScore;
除权重外,画像本身也要防污染。曾有业务把站内弹窗强制曝光算作用户兴趣,导致画像向量偏移,协同过滤被迫跟随错误信号,整体时长下降。因此画像 pipeline 应区分主动行为与被动曝光,被动曝光仅做弱负反馈处理。只有保证画像干净,协同过滤才能在它之上长出准确的个性化分支,而不是被带偏的先验绑架。
user_profilecollaborative_filteringrecommendation_system修改时间:2026-08-18 11:18:31