网格上的个性化 PageRank

本示例演示了如何在网格上计算和可视化个性化 PageRank。我们使用 igraph.Graph.personalized_pagerank() 方法,并演示其在网格图上的效果。

注意

顶点的 PageRank 分数反映了随机游走者长期处于该顶点的概率。在每一步中,游走者有 1 - 阻尼系数的概率重新开始游走,并根据重置向量中定义的概率选择一个起始顶点。

import igraph as ig
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import numpy as np

我们定义了一个函数,用于在 Matplotlib 坐标轴上绘制图,并显示其个性化 PageRank 值。该函数还在侧面生成一个颜色条,以查看值的变化。我们使用 Matplotlib 的 Normalize 类 来设置颜色并确保颜色条范围正确。

def plot_pagerank(graph: ig.Graph, p_pagerank: list[float]):
    """Plots personalized PageRank values on a grid graph with a colorbar.

    Parameters
    ----------
    graph : ig.Graph
        graph to plot
    p_pagerank : list[float]
        calculated personalized PageRank values
    """
    # Create the axis for matplotlib
    _, ax = plt.subplots(figsize=(8, 8))

    # Create a matplotlib colormap
    # coolwarm goes from blue (lowest value) to red (highest value)
    cmap = cm.coolwarm

    # Normalize the PageRank values for colormap
    normalized_pagerank = ig.rescale(p_pagerank)

    graph.vs["color"] = [cmap(pr) for pr in normalized_pagerank]
    graph.vs["size"] = ig.rescale(p_pagerank, (20, 40))
    graph.es["color"] = "gray"
    graph.es["width"] = 1.5

    # Plot the graph
    ig.plot(graph, target=ax, layout=graph.layout_grid())

    # Add a colorbar
    sm = cm.ScalarMappable(norm=plt.Normalize(min(p_pagerank), max(p_pagerank)), cmap=cmap)
    plt.colorbar(sm, ax=ax, label="Personalized PageRank")

    plt.title("Graph with Personalized PageRank")
    plt.axis("equal")
    plt.show()

首先,我们生成一个图,例如格点图(Lattice Graph),它本质上是一个 dim x dim 的网格。

dim = 5
grid_size = (dim, dim)  # dim rows, dim columns
g = ig.Graph.Lattice(dim=grid_size, circular=False)

然后我们初始化 reset_vector(其长度应等于图中顶点的数量)。

reset_vector = np.zeros(g.vcount())

然后我们设置要优先考虑的节点,例如索引为 018 的节点。

reset_vector[0] = 1
reset_vector[18] = 0.65

接着我们计算个性化 PageRank。

personalized_page_rank = g.personalized_pagerank(damping=0.85, reset=reset_vector)

最后,我们绘制带有个性化 PageRank 值的图。

plot_pagerank(g, personalized_page_rank)
Graph with Personalized PageRank

或者,我们可以调整 damping 参数。

personalized_page_rank = g.personalized_pagerank(damping=0.45, reset=reset_vector)

在这里我们可以看到使用新阻尼参数的相同图表。

plot_pagerank(g, personalized_page_rank)
Graph with Personalized PageRank

脚本总运行时间: (0 分钟 0.443 秒)

此图库由 Sphinx-Gallery 生成