PageRank / Personalized PageRank:图数据库节点重要性与增量更新 ACERS 解析

副标题 / 摘要 连通性告诉你“图怎么分块”,而 PageRank 告诉你“块里谁更重要”。这正是图数据库区别于关系数据库的关键能力之一:不仅能做连接,还能做结构化重要性传播。本文按 ACERS 结构讲清 PageRank / PPR 的算法原理与工程落地。 预计阅读时长:15~20 分钟 标签:PageRank、PPR、图数据库、稀疏矩阵 SEO 关键词:PageRank, Personalized PageRank, 稀疏矩阵, 增量更新, 图数据库 元描述:从经典 PageRank 到 Personalized PageRank,覆盖迭代计算、稀疏矩阵优化与增量更新策略,并给出多语言可运行实现。 目标读者 需要在图数据库做排序、推荐、影响力分析的工程师 已掌握 BFS/DFS/连通分量,想进阶“图上评分”方法的开发者 关注大图线上迭代性能与更新延迟的算法工程师 背景 / 动机 你前面已经把图分成了连通分量和 SCC,但工程里还有一个更难的问题: 同一个分量里,谁更关键? 给定一个用户或种子节点,谁与它“结构上更相关”? 这就是 PageRank / Personalized PageRank(PPR) 的职责。 这也是图数据库和关系数据库的关键差异之一: 关系数据库强在 Join 与过滤(行/列视角) 图数据库强在拓扑传播(边结构视角) PageRank 本质是“在图上做概率质量传播”,它把局部连边和全局结构合成一个可排序分值。 核心概念 PageRank:全局重要性分数,和入链质量相关,不仅是入度多少 Personalized PageRank(PPR):在随机游走中偏向某个种子集合,得到“个性化重要性” 阻尼系数 d/alpha:控制继续沿边游走还是回到随机跳转/种子分布 稀疏矩阵:大图邻接矩阵极稀疏,必须用 CSR/CSC 或邻接表实现乘法 增量更新:图边/节点变化后,尽量局部修正而非全量重算 A — Algorithm(题目与算法) 题目还原(工程化) 给定有向图 G=(V,E),计算每个节点的重要性分数: PageRank:输出全图统一重要性 PPR:给定种子分布 s,输出相对该种子的个性化重要性 输入输出 名称 类型 描述 n int 节点数量 edges List[(u,v)] 有向边 u -> v d / alpha float 阻尼系数,通常 0.85 左右 s vector PPR 的种子分布(和为 1) 返回 vector 每个节点的 rank 分数 示例 1(PageRank) n = 4 edges = [(0,1),(1,2),(2,0),(2,3)] 输出: rank[0..3] 特点: 0/1/2 构成循环,3 只入不出,分数受结构影响而非简单入度 示例 2(PPR) 同上图,种子节点设为 2(s[2]=1) 输出: ppr[0..3] 特点: 与节点 2 路径近、可达性强的节点得分更高 思路推导(从朴素到可用) 朴素想法 1:按入度排序 问题: ...

2026年2月9日 · 8 分钟 · map[name:Jeanphilo]

“喜欢这个的人也喜欢…”:电商推荐的最小实现

副标题 / 摘要 “相似商品推荐”的核心是共购关系。本文用最小协同过滤思路解释实现方法。 目标读者 需要搭建推荐功能的工程师 负责电商系统的开发者 学习基础推荐算法的人 背景 / 动机 推荐系统能提升转化率与停留时间。 最简单的实现方式是基于“共购/共点”统计。 核心概念 协同过滤:基于用户行为的相似性 共购矩阵:商品一起出现的次数 召回与排序:先找候选,再排序 实践指南 / 步骤 收集用户行为(购买/浏览) 统计共现关系 生成候选集 结合热度或规则排序 可运行示例 from collections import Counter def recommend(orders, item): co = Counter() for order in orders: if item in order: for x in order: if x != item: co[x] += 1 return [x for x, _ in co.most_common(3)] if __name__ == "__main__": orders = [ ["A", "B", "C"], ["A", "B"], ["A", "D"], ["B", "C"], ] print(recommend(orders, "A")) 解释与原理 协同过滤假设“经常一起出现的商品更相关”。 这是冷启动与小规模电商的常用起点。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]