
1) 【一句话结论】
核心是通过用户行为数据构建加权兴趣向量,利用余弦相似度计算用户间兴趣相似性,结合矩阵分解缓解数据稀疏性,并采用内容标签+内容热度的冷启动策略,实现精准好友/内容推荐。
2) 【原理/概念讲解】
用户画像构建:先清洗用户行为数据(过滤系统自动点赞、误操作等无效行为),对点赞(+2)、评论(+1)、分享(+3)加权,每个内容ID为向量维度,互动次数为值,形成用户兴趣向量(类比:向量长度和方向体现兴趣强度,维度是内容,值是偏好权重)。
相似度计算:用余弦相似度衡量向量夹角,夹角越小(值越接近1)兴趣越相似(如用户A和B都偏好科技+新闻,向量夹角小,相似度高)。为处理数据稀疏性,当用户互动内容少时,用矩阵分解(如SVD)降维,提取潜在兴趣因子,补充内容特征(如标签、类别),避免低质量行为影响结果。
冷启动策略:新用户无历史行为时,结合内容标签(热门标签排序)和内容热度(近期互动多的内容),通过内容特征与用户兴趣向量的匹配,提升推荐个性化(如新用户u4推荐标签最多且近期互动多的内容)。
3) 【对比与适用场景】
| 推荐策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 基于内容推荐 | 基于内容特征(标签等)推荐相似内容 | 依赖内容特征,用户行为少时效果差 | 用户行为稀疏,内容特征明确(如标签) | 需内容特征提取,冷启动问题 |
| 协同过滤(基于用户) | 基于用户间行为相似性推荐 | 依赖用户历史,冷启动严重 | 用户行为丰富,社交关系强 | 数据稀疏性,计算复杂度高 |
| 混合推荐 | 结合内容+协同过滤 | 互补优势,提升效果 | 复杂场景,需多种数据 | 实现复杂,需平衡权重(如内容30%,协同70%) |
4) 【示例】
# 1. 数据清洗与加权
def clean_actions(actions):
valid = [(item_id, action, weight) for item_id, action, weight in actions
if not (action == "like" and weight == 0)]
return valid
# 2. 构建用户行为矩阵(用户-内容)
user_actions = {
"u1": [(1, "like", 2), (2, "comment", 1), (3, "share", 3)],
"u2": [(1, "like", 2), (4, "share", 3)],
"u3": [(2, "like", 2), (5, "comment", 1)]
}
for user in user_actions:
user_actions[user] = clean_actions(user_actions[user])
# 3. 矩阵分解(处理稀疏性,用SVD降维)
from sklearn.decomposition import TruncatedSVD
import numpy as np
user_item_matrix = np.zeros((len(user_actions), len(set(item_id for actions in user_actions.values() for item_id, _, _ in actions))))
for i, (user, actions) in enumerate(user_actions.items()):
for item_id, _, weight in actions:
idx = list(set(item_id for actions in user_actions.values() for item_id, _, _ in actions)).index(item_id)
user_item_matrix[i, idx] = weight
svd = TruncatedSVD(n_components=50) # 降维到50维
user_vectors = svd.fit_transform(user_item_matrix)
# 4. 相似度计算优化(倒排索引+ANN)
from faiss import IndexFlatIP
index = IndexFlatIP(50) # 维度50
index.add(user_vectors)
# 5. 冷启动:新用户u4
new_user = "u4"
content_tags = {
1: ["科技", "新闻"],
2: ["科技", "评论"],
3: ["科技", "分享"],
4: ["科技", "分享"],
5: ["科技", "评论"]
}
content_popularity = {item_id: sum(1 for user in content_to_users[item_id] if user != new_user) for item_id in content_tags}
recommended_items = sorted(content_tags.items(), key=lambda x: (content_popularity.get(x[0], 0), len(x[1])), reverse=True)[:3]
print(f"新用户u4推荐:{recommended_items}")
5) 【面试口播版答案】
各位面试官好,关于用户兴趣匹配算法,核心是通过用户行为数据构建加权兴趣向量,利用余弦相似度计算用户间兴趣相似性,并结合矩阵分解缓解数据稀疏性,同时采用内容标签+内容热度的冷启动策略,实现精准好友/内容推荐。首先,用户画像构建:我们会先清洗用户行为数据,过滤系统自动点赞、误操作等无效行为,对点赞(+2)、评论(+1)、分享(+3)加权,每个内容ID为维度,互动次数为值,形成用户兴趣向量。比如用户对科技类内容的互动越多,向量中对应维度值越高,兴趣越强。接着计算相似度,用余弦相似度衡量向量夹角,夹角小则兴趣相似,比如两个用户都偏好科技+新闻,向量夹角小,相似度高。为了处理数据稀疏性,当用户互动内容少时,用矩阵分解(如SVD)降维,提取潜在兴趣因子,补充内容特征,避免低质量行为影响结果。冷启动方面,新用户无历史行为时,结合内容标签(热门标签排序)和内容热度(近期互动多的内容),比如新用户u4,推荐标签最多且近期互动多的内容。这样既解决冷启动问题,又提升推荐个性化。总结来说,通过行为数据建模、相似度计算优化和冷启动策略,实现精准推荐。
6) 【追问清单】
7) 【常见坑/雷区】