1. 什么是多兴趣召回?
在推荐系统中,用户的兴趣往往是多样化的。单一兴趣的推荐无法全面捕捉用户行为,可能导致召回效果较差。多兴趣召回通过识别用户在不同兴趣方向的偏好,从而对用户进行多兴趣建模,生成多个兴趣向量,用以召回不同类别的物品。
多兴趣召回的核心是通过神经网络或聚类方法,将用户的行为序列划分为不同的兴趣向量,每个兴趣向量代表用户的某一类偏好。
2. 多兴趣召回的底层原理
多兴趣召回基于深度学习中的 Capsule Network(胶囊网络) 或 行为聚类 来实现用户兴趣的多向量表达。以下是两种主流方法的原理:
2.1 基于行为聚类的多兴趣
- 用户行为数据:用户的点击、购买等行为被映射为向量,每个物品也有其向量表示。
- 聚类分析:对用户的行为向量进行聚类,将其分为多个兴趣簇。
- 兴趣向量生成:每个兴趣簇生成一个兴趣向量,代表用户在该兴趣方向的偏好。
2.2 基于胶囊网络的多兴趣
胶囊网络通过动态路由机制,将用户行为动态分配到不同兴趣胶囊中。每个兴趣胶囊代表一个兴趣向量,可以更灵活地捕捉用户的兴趣变化。
实现步骤
- 行为序列嵌入:用户的行为序列通过嵌入层转换为向量序列。
- 胶囊层实现:使用胶囊网络处理嵌入向量,通过动态路由协议提取多兴趣向量。
- 输出层:根据兴趣向量计算用户对各类物品的兴趣得分。
胶囊网络 的具体原理见另一篇文章 胶囊网络的原理解析。
3. 实现多兴趣召回
以下是完整实现过程,采用基于行为聚类的多兴趣召回,结合深度学习框架生成用户兴趣向量。
3.1 数据准备
假设有用户的物品点击序列,每个物品都有一个向量表示(如嵌入向量)。
import numpy as np
import pandas as pd
# 用户点击序列模拟数据
user_behavior = {
"用户ID": ["用户1", "用户1", "用户1", "用户2", "用户2", "用户3", "用户3", "用户3"],
"物品ID": ["A", "B", "C", "A", "D", "B", "A", "C"],
"时间戳": [1, 2, 3, 1, 2, 1, 2, 3]
}
# 转换为DataFrame
behavior_df = pd.DataFrame(user_behavior)
# 模拟物品嵌入向量
item_embeddings = {
"A": np.random.rand(8),
"B": np.random.rand(8),
"C": np.random.rand(8),
"D": np.random.rand(8),
}
# 将物品向量加入用户行为数据
behavior_df["物品向量"] = behavior_df["物品ID"].apply(lambda x: item_embeddings[x])
print("\n用户行为数据:")
print(behavior_df)
解释:
- 每个物品用一个固定维度的嵌入向量表示。
- 用户行为数据按照时间排序,构成用户的兴趣轨迹。
3.2 用户行为向量生成
将用户点击的物品向量聚合,生成用户的行为序列。
# 按用户ID分组,将物品向量按时间顺序排列
user_behavior_vectors = behavior_df.groupby("用户ID")["物品向量"].apply(list)
print("\n用户的行为序列向量:")
print(user_behavior_vectors)
输出:
- 用户点击物品对应的向量序列,用于后续的多兴趣提取。
3.3 使用KMeans进行多兴趣提取
核心思路:
- 用户的行为序列表示用户的所有兴趣。
- 对这些行为序列进行聚类,分为多个兴趣簇。
- 每个兴趣簇生成一个兴趣向量,表示用户在该方向的偏好。
from sklearn.cluster import KMeans
def extract_user_interests(user_vectors, n_clusters=3):
"""
提取用户的多兴趣向量。
参数:
- user_vectors: 用户行为序列(物品嵌入向量列表)。
- n_clusters: 兴趣簇的数量。
返回:
- interests: 用户的多兴趣向量列表。
"""
# 将用户行为向量展平为二维数组
user_vectors_flattened = np.vstack(user_vectors)
# 使用KMeans对用户行为聚类
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(user_vectors_flattened)
# 生成兴趣向量:每个簇的中心作为兴趣向量
interests = kmeans.cluster_centers_
return interests
# 示例:提取用户1的多兴趣
user_1_vectors = np.array(user_behavior_vectors["用户1"])
user_1_interests = extract_user_interests(user_1_vectors, n_clusters=2)
print("\n用户1的多兴趣向量:")
print(user_1_interests)
3.4 使用深度学习生成兴趣向量
对于更复杂的场景,可以用深度学习模型(如Transformer)来提取多兴趣。
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Embedding, LSTM, Lambda
from tensorflow.keras.models import Model
# 模拟用户行为序列输入
max_seq_length = 5 # 最大序列长度
embedding_dim = 8 # 嵌入向量维度
num_interests = 3 # 多兴趣的数量
# 构建模型
inputs = Input(shape=(max_seq_length, embedding_dim), name="行为序列输入")
lstm_output = LSTM(16, return_sequences=True)(inputs) # LSTM提取序列特征
# 使用全连接层生成兴趣向量
interest_vectors = Dense(num_interests * embedding_dim, activation="relu")(lstm_output)
interest_vectors = tf.reshape(interest_vectors, [-1, num_interests, embedding_dim]) # 生成多兴趣
# 输出兴趣向量模型
model = Model(inputs=inputs, outputs=interest_vectors)
model.summary()
# 输入用户行为序列
dummy_input = np.random.rand(1, max_seq_length, embedding_dim)
output_interests = model.predict(dummy_input)
print("\n用户行为序列生成的兴趣向量:")
print(output_interests)
解释:
LSTM
提取序列特征。- 每个兴趣用一个独立的向量表示(维度与物品向量相同)。
3.5 多兴趣召回
根据用户的多兴趣向量,召回与每个兴趣向量最相似的物品。
def recommend_with_interests(interests, item_embeddings, top_k=3):
"""
根据用户的多兴趣向量召回物品。
参数:
- interests: 用户的多兴趣向量列表。
- item_embeddings: 物品的嵌入向量字典。
- top_k: 每个兴趣召回的物品数量。
返回:
- recommendations: 推荐的物品列表。
"""
recommendations = []
for interest in interests:
# 计算兴趣向量与所有物品向量的相似度
similarity_scores = {item: np.dot(interest, vec) for item, vec in item_embeddings.items()}
# 按相似度排序,取前K个物品
top_items = sorted(similarity_scores.items(), key=lambda x: x[1], reverse=True)[:top_k]
recommendations.extend([item[0] for item in top_items])
return recommendations
# 示例:根据用户1的多兴趣推荐物品
recommendations = recommend_with_interests(user_1_interests, item_embeddings, top_k=2)
print("\n根据用户1的多兴趣推荐的物品:")
print(recommendations)
4. 总结与输出解释
4.1 核心流程
- 用户行为序列生成:基于用户的点击、购买等行为,生成时间序列。
- 多兴趣提取:使用聚类或深度学习模型提取用户的多个兴趣向量。
- 物品召回:根据兴趣向量与物品向量的相似度,召回匹配的物品。
4.2 输出结果
- 多兴趣向量:
用户兴趣向量表示用户在不同方向的偏好,例如:[[0.8, 0.3, ...], [0.2, 0.9, ...]]
- 推荐物品:
根据用户兴趣向量,为用户推荐相关的物品,如:['物品B', '物品C', '物品A']
4.3 部署到生产
- 将兴趣向量提前离线生成,存储在数据库中。
- 在在线阶段,通过API接口返回推荐结果。