标签: AGI

  • 个性化推荐中的子图挖掘:让推荐更懂你

    你是否曾经在电商平台上浏览过一件商品,却迟迟没有下手?然后,你发现首页推荐里出现了类似的商品,甚至还有一些你可能感兴趣的周边产品?这背后,正是推荐系统利用了子图挖掘技术,它能从用户行为数据中找到隐藏的关联关系,从而实现更精准的个性化推荐。

    本文将带你深入了解子图挖掘在推荐系统中的应用,并以 KDD 2020 年教程为例,解析如何利用 Pandas 和 NetworkX 库进行子图提取和分析。

    子图挖掘:从用户行为中发现宝藏

    传统的推荐系统往往只关注用户与商品之间的直接交互关系,例如购买记录、浏览记录等。然而,用户行为数据中蕴藏着更丰富的信息,例如用户对不同商品的偏好程度、用户之间的社交关系等等。子图挖掘技术可以帮助我们从这些复杂的数据中提取出有价值的子图,从而更好地理解用户行为,并为推荐系统提供更精准的依据。

    举个例子:假设一位用户购买了篮球鞋,并浏览了篮球服和篮球训练视频。通过子图挖掘,我们可以发现这位用户对篮球运动有着浓厚的兴趣,并推荐他可能感兴趣的篮球装备、比赛直播等信息。

    Pandas 和 NetworkX:高效的子图挖掘工具

    在 Python 中,Pandas 和 NetworkX 库为我们提供了强大的子图挖掘工具。

    • Pandas 擅长处理表格数据,可以方便地将用户行为数据转换为图结构。
    • NetworkX 提供了丰富的图操作函数,可以用于子图提取、分析和可视化。

    KDD 2020 年教程中,作者展示了如何利用 Pandas 和 NetworkX 库提取用户行为子图。

    1. 数据准备

    首先,我们将用户行为数据存储在 Pandas DataFrame 中,并将其转换为 NetworkX 图结构。

    import pandas as pd
    import networkx as nx
    
    # 读取用户行为数据
    interactions = pd.read_csv("interactions.csv")
    
    # 创建 NetworkX 图
    G = nx.from_pandas_edgelist(interactions, source="user_id", target="item_id")

    2. 子图提取

    接下来,我们可以利用 NetworkX 的 ego_graph 函数提取以特定用户为中心的子图。

    # 提取以用户 1 为中心的子图
    ego_graph = nx.ego_graph(G, 1, radius=2)
    
    # 打印子图节点和边
    print(ego_graph.nodes())
    print(ego_graph.edges())

    3. 子图分析

    我们可以对提取的子图进行进一步分析,例如计算节点度、中心性等指标,以更好地理解用户行为。

    # 计算子图节点度
    degrees = dict(ego_graph.degree())
    print(degrees)
    
    # 计算子图节点中心性
    centrality = nx.degree_centrality(ego_graph)
    print(centrality)

    4. 子图可视化

    最后,我们可以利用 NetworkX 的 draw 函数将子图可视化,以便更好地理解用户行为和推荐策略。

    # 可视化子图
    nx.draw(ego_graph, with_labels=True)
    plt.show()

    子图挖掘:推荐系统的未来

    子图挖掘技术为推荐系统提供了更精准、更个性化的解决方案。它可以帮助我们更好地理解用户行为,并为用户提供更符合其兴趣和需求的推荐。

    随着数据量的不断增长和算法的不断发展,子图挖掘技术将在推荐系统中发挥越来越重要的作用。未来,我们将看到更多基于子图挖掘的推荐系统,为用户提供更智能、更便捷的体验。

    参考文献

  • 使用 Pandas 进行子图抽样:本地示例


    本笔记本展示了如何使用 Pandas 在本地进行子图抽样。我们将通过一个示例数据集来演示这一过程。

    1. 导入必要的库

    首先,我们需要导入必要的 Python 库:

    import pandas as pd
    import numpy as np
    import networkx as nx
    import matplotlib.pyplot as plt

    2. 创建示例数据集

    我们将创建一个简单的图数据集来演示子图抽样过程。

    # 创建节点列表
    nodes = pd.DataFrame({
        'node_id': [1, 2, 3, 4, 5, 6],
        'feature': ['A', 'B', 'C', 'D', 'E', 'F']
    })
    
    # 创建边列表
    edges = pd.DataFrame({
        'source': [1, 1, 2, 3, 4, 5],
        'target': [2, 3, 4, 5, 6, 1],
        'weight': [1.0, 2.0, 1.0, 3.0, 1.0, 4.0]
    })
    
    print("节点列表:")
    print(nodes)
    
    print("\n边列表:")
    print(edges)

    输出:

    节点列表:
       node_id feature
    0        1       A
    1        2       B
    2        3       C
    3        4       D
    4        5       E
    5        6       F
    
    边列表:
       source  target  weight
    0       1       2     1.0
    1       1       3     2.0
    2       2       4     1.0
    3       3       5     3.0
    4       4       6     1.0
    5       5       1     4.0

    3. 创建网络图

    使用 NetworkX 创建一个网络图。

    # 初始化图
    G = nx.Graph()
    
    # 添加节点和特征
    for _, row in nodes.iterrows():
        G.add_node(row['node_id'], feature=row['feature'])
    
    # 添加边和权重
    for _, row in edges.iterrows():
        G.add_edge(row['source'], row['target'], weight=row['weight'])
    
    # 绘制图
    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray', node_size=500, font_size=15)
    labels = nx.get_edge_attributes(G, 'weight')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
    
    plt.title("示例网络图")
    plt.show()

    4. 进行子图抽样

    现在,我们将从图中抽样一个子图。我们将选择一个起始节点,并递归地选择与其相连的节点,直到达到预定的子图大小。

    def sample_subgraph(G, start_node, sample_size):
        nodes_to_visit = [start_node]
        visited_nodes = set()
    
        while nodes_to_visit and len(visited_nodes) < sample_size:
            current_node = nodes_to_visit.pop(0)
            if current_node not in visited_nodes:
                visited_nodes.add(current_node)
                neighbors = list(G.neighbors(current_node))
                nodes_to_visit.extend(neighbors)
    
        subgraph = G.subgraph(visited_nodes)
        return subgraph
    
    # 抽样子图
    start_node = 1
    sample_size = 4
    subgraph = sample_subgraph(G, start_node, sample_size)
    
    # 绘制子图
    pos = nx.spring_layout(subgraph)
    nx.draw(subgraph, pos, with_labels=True, node_color='lightgreen', edge_color='gray', node_size=500, font_size=15)
    labels = nx.get_edge_attributes(subgraph, 'weight')
    nx.draw_networkx_edge_labels(subgraph, pos, edge_labels=labels)
    
    plt.title("抽样子图")
    plt.show()

    5. 分析子图

    我们可以对抽样得到的子图进行进一步的分析,比如计算子图中节点的度数分布。

    “`python

    计算子图中节点的度数分布

    degree_distribution = pd.DataFrame(subgraph.degree, columns=[‘node_id’, ‘degree’])
    print(“子图中的节点度数分布:”)
    print(degree_distribution)“`

    输出:

    子图中的节点度数分布:
    node_id degree
    0 1 2
    1 2 2
    2 3 1
    3 4 1

    ## 6. 保存和加载子图
    
    为了方便以后的分析,我们可以将子图保存到文件中,并在需要时重新加载。
    
    ### 保存子图
    
    我们可以使用 NetworkX 提供的函数将子图保存为图文件格式(如 GML 或 GraphML)。

    python

    保存子图为 GML 格式

    nx.write_gml(subgraph, “subgraph.gml”)
    print(“子图已保存为 subgraph.gml”)

    ### 加载子图
    
    我们可以使用相应的函数从文件中加载保存的子图。

    python

    从 GML 文件加载子图

    loaded_subgraph = nx.read_gml(“subgraph.gml”)
    print(“子图已从 subgraph.gml 加载”)

    绘制加载的子图

    pos = nx.spring_layout(loaded_subgraph)
    nx.draw(loaded_subgraph, pos, with_labels=True, node_color=’lightcoral’, edge_color=’gray’, node_size=500, font_size=15)
    labels = nx.get_edge_attributes(loaded_subgraph, ‘weight’)
    nx.draw_networkx_edge_labels(loaded_subgraph, pos, edge_labels=labels)

    plt.title(“加载的子图”)
    plt.show()
    “`

    7. 结论

    在本教程中,我们展示了如何使用 Pandas 和 NetworkX 在本地进行子图抽样。我们通过一个简单的示例数据集展示了从数据加载、图创建、子图抽样到子图分析的完整过程。希望这些内容对您理解和应用子图抽样有所帮助。

    参考资料

    [1] NetworkX Documentation: https://networkx.github.io/documentation/stable/

    [2] Pandas Documentation: https://pandas.pydata.org/pandas-docs/stable/

    [3] Matplotlib Documentation: https://matplotlib.org/stable/contents.html


    通过以上步骤,您应该能够成功地在本地进行子图抽样并进行相应的分析。希望这个示例能够帮助您更好地理解和应用子图抽样技术。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 2250 | UV: 1217
Last updated: 2025-06-24 10:32:57
沪ICP备2024052574号-1