【问题标题】:How to implement random walks with restarts in python如何在 python 中通过重启实现随机游走
【发布时间】:2020-04-21 06:28:35
【问题描述】:

我有以下使用networkx 创建的图表。

import networkx as nx

G = nx.Graph()

G.add_nodes_from(["John", "Mary", "Jill", "Todd",
                  "iPhone5", "Kindle Fire", "Fitbit Flex Wireless", "Harry Potter", "Hobbit"])

G.add_edges_from([
    ("John", "iPhone5"),
    ("John", "Kindle Fire"),
    ("Mary", "iPhone5"),
    ("Mary", "Kindle Fire"),
    ("Mary", "Fitbit Flex Wireless"),
    ("Jill", "iPhone5"),
    ("Jill", "Kindle Fire"),
    ("Jill", "Fitbit Flex Wireless"),
    ("Todd", "Fitbit Flex Wireless"),
    ("Todd", "Harry Potter"),
    ("Todd", "Hobbit"),
])

现在,我想执行random walk with restarts 来识别与John 最相似的用户。我在networkx 中搜索了文档,但在networkx 中找不到它的实现。

如果有 random walk with restarts 的 python 库/代码来执行此操作,请告诉我。

如果需要,我很乐意提供更多详细信息。

编辑

如果我现有网络的权重如下所示,我是否仍会按以下方式计算随机游走并重新启动:nx.pagerank_numpy(G, personalization={"John": 1})

import networkx as nx

G = nx.Graph()

G.add_nodes_from(["John", "Mary", "Jill", "Todd",
                  "iPhone5", "Kindle Fire", "Fitbit Flex Wireless", "Harry Potter", "Hobbit"])

G.add_weighted_edges_from([
    ("John", "iPhone5", 0.1),
    ("John", "Kindle Fire", 0.2),
    ("Mary", "iPhone5", 0.3),
    ("Mary", "Kindle Fire", 0.4),
    ("Mary", "Fitbit Flex Wireless", 0.5),
    ("Jill", "iPhone5", 0.9),
    ("Jill", "Kindle Fire", 0.1),
    ("Jill", "Fitbit Flex Wireless", 0.1),
    ("Todd", "Fitbit Flex Wireless", 0.1),
    ("Todd", "Harry Potter", 0.1),
    ("Todd", "Hobbit", 0.1),
])

【问题讨论】:

    标签: python networkx igraph


    【解决方案1】:

    个性化 PageRank —implemented in networkx — 本质上是一个随机游走,如果个性化向量的起始节点为 1,其他地方为 0,则重新开始。

    以下代码

    nx.pagerank_numpy(G, personalization={"John": 1})
    

    然后产生一个字典,该字典有可能在每个节点中结束

    {'John': 0.24958826532666656,
     'Mary': 0.1229452674202248,
     'Jill': 0.12294526742022475,
     'Todd': 0.04506174037342413,
     'iPhone5': 0.17574399763529416,
     'Kindle Fire': 0.17574399763529416,
     'Fitbit Flex Wireless': 0.08243647797726429,
     'Harry Potter': 0.012767493105803515,
     'Hobbit': 0.012767493105803515}
    

    从这本词典中,您可以选择概率最高的用户。

    对于加权图pagerank_numpy 方法有一个weight 参数,您可以在其中设置要使用的边数据键。当使用add_weighted_edges_from 添加边时,此数据键称为"weight",因此代码如下。

    nx.pagerank_numpy(G, personalization={"John": 1}, weight="weight")
    

    【讨论】:

    • 非常感谢您的精彩回答。我不知道个性化的 pagerank 是在 networkx 中重新启动的随机游走。在这方面你有什么我可以引用的支持证据吗?谢谢你:)
    • 大多数关于高效 PageRank 计算或其应用的论文都提到了这一点。这是onetwothree 示例。
    • 谢谢。我发现您链接的论文非常有用。我有最后一个问题,我认为很高兴得到您的反馈。请参阅我更新问题的“编辑:”部分。更具体地说,我想知道我是否会以与加权网络相同的方式计算随机游走和重启?谢谢你:)
    • 有一个weight 参数——我已经更新了我的答案。
    • 非常感谢。这非常有用。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多