知识图谱(Knowledge Graph, KG)推荐利用结构化的外部知识(物品属性、实体关系)增强推荐效果。知识图谱可以提供物品间的语义关联、可解释的推理路径,以及缓解冷启动问题。
| 范式 | 方法 | 代表模型 | 特点 |
|---|---|---|---|
| Embedding-based | KG嵌入+推荐 | CKE/KTUP | 端到端学习 |
| Path-based | 推理路径 | RI/PGPR | 可解释 |
| Graph-based | 联合图传播 | KGCN/KGAT | 融合结构信息 |
知识图谱的核心价值:语义增强(提供物品间关联)、可解释性(推理路径)、冷启动(新物品有属性信息)。
h + r ≈ t
得分函数: f(h,r,t) = ||h+r-t||
M_r·h + r ≈ M_r·t
每个关系有独立的投影空间
e_u = Σ α(u,i) · W · e_i
注意力权重α基于实体关系
import numpy as np
np.random.seed(42)
print("="*60+"\n知识图谱推荐系统\n"+"="*60)
# 构建简单知识图谱
entities=[];relations=[];triples=[]
# 用户实体
for i in range(15):entities.append(f"User_{i}")
# 物品实体
for i in range(12):entities.append(f"Item_{i}")
# 属性实体
attrs=["Action","Comedy","Drama","SciFi","Romance","Thriller",
"Director_A","Director_B","Director_C","Actor_X","Actor_Y","Actor_Z"]
entities.extend(attrs)
print(f"实体数:{len(entities)}")
# 知识图谱三元组
triples=[
("Item_0","genre","Action"),("Item_0","director","Director_A"),
("Item_1","genre","Comedy"),("Item_1","actor","Actor_X"),
("Item_2","genre","Drama"),("Item_2","director","Director_B"),
("Item_3","genre","SciFi"),("Item_3","actor","Actor_Y"),
("Item_4","genre","Action"),("Item_4","actor","Actor_Z"),
("Item_5","genre","Romance"),("Item_5","director","Director_C"),
("Item_6","genre","Comedy"),("Item_6","director","Director_A"),
("Item_7","genre","Thriller"),("Item_7","actor","Actor_X"),
("Item_8","genre","Action"),("Item_8","actor","Actor_Y"),
("Item_9","genre","Drama"),("Item_9","director","Director_B"),
("Item_10","genre","SciFi"),("Item_10","actor","Actor_Z"),
("Item_11","genre","Romance"),("Item_11","director","Director_C"),
]
# 用户-物品交互
interactions=[]
for u in range(15):
n=np.random.randint(2,5)
for i in np.random.choice(12,size=min(n,12),replace=False):
interactions.append((f"User_{u}",f"Item_{i}"))
triples.append((f"User_{u}","interact",f"Item_{i}"))
print(f"交互数:{len(interactions)} 三元组数:{len(triples)}")
# TransE知识图谱嵌入
n_ent=len(entities);n_rel=20;emb_size=16
ent2idx={e:i for i,e in enumerate(entities)}
rel2idx={"genre":0,"director":1,"actor":2,"interact":3}
ent_emb=np.random.randn(n_ent,emb_size)*0.1
rel_emb=np.random.randn(n_rel,emb_size)*0.1
print("\n--- TransE训练 ---")
lr_te=0.01;margin=1.0
for ep in range(50):
total_loss=0
for h,r,t in triples:
h_idx=ent2idx[h];t_idx=ent2idx[t];r_idx=rel2idx.get(r,4)
# 负采样
t_neg=ent2idx[np.random.choice(entities)]
while t_neg==t_idx:t_neg=ent2idx[np.random.choice(entities)]
pos_score=np.linalg.norm(ent_emb[h_idx]+rel_emb[r_idx]-ent_emb[t_idx])
neg_score=np.linalg.norm(ent_emb[h_idx]+rel_emb[r_idx]-ent_emb[t_neg])
loss=max(0,margin+pos_score-neg_score)
total_loss+=loss
if loss>0:
grad_h=2*(ent_emb[h_idx]+rel_emb[r_idx]-ent_emb[t_idx])-2*(ent_emb[h_idx]+rel_emb[r_idx]-ent_emb[t_neg])
ent_emb[h_idx]-=lr_te*grad_h
rel_emb[r_idx]-=lr_te*grad_h
ent_emb[t_idx]+=lr_te*2*(ent_emb[h_idx]+rel_emb[r_idx]-ent_emb[t_idx])
if(ep+1)%10==0:print(f" Epoch{ep+1}:Loss={total_loss:.4f}")
# KG增强推荐
print("\n--- KG增强推荐 ---")
# 用户画像(基于交互物品的属性)
user_profiles={}
for u in range(15):
profile=np.zeros(emb_size)
count=0
for uu,item in interactions:
if uu==f"User_{u}":
profile+=ent_emb[ent2idx[item]]
count+=1
if count>0:user_profiles[u]=profile/count
else:user_profiles[u]=np.random.randn(emb_size)*0.01
# 推荐得分(用户画像 vs 物品embedding + 知识增强)
for u in range(5):
scores={}
for i in range(12):
item_emb=ent_emb[ent2idx[f"Item_{i}"]]
# 基础得分
base_score=np.dot(user_profiles[u],item_emb)
# 知识增强:考虑物品的属性关联
kg_bonus=0
for h,r,t in triples:
if h==f"Item_{i}" and r in ["genre","director","actor"]:
t_idx=ent2idx[t]
kg_bonus+=0.1*np.dot(user_profiles[u],ent_emb[t_idx])
scores[i]=base_score+kg_bonus
top3=sorted(scores.items(),key=lambda x:-x[1])[:3]
print(f" User_{u}推荐:{[(f'Item_{i}',f'{s:.3f}')for i,s in top3]}")
# 知识推理路径
print("\n知识推理路径示例:")
for item in ["Item_0","Item_1"]:
paths=[]
for h,r,t in triples:
if h==item:paths.append(f"{h}--[{r}]-->{t}")
print(f" {item}的知识路径: {paths}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第11课:知识图谱推荐,属于特征与模型阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现TransR(关系特定投影空间)
练习2:实现KGAT(知识图谱注意力网络)
练习3:实现基于推理路径的可解释推荐
练习4:从自由文本自动抽取知识图谱三元组
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解知识图谱在推荐中的价值
✅ 掌握KG推荐的三大范式
✅ 实现TransE知识图谱嵌入
✅ 理解知识图谱构建与推理路径