FR算法(Fruchterman-Reingold)Python实现

2023-05-16

简介Fruchterman Reingold (FR)

FR算法将所有的结点看做是电子,每个结点收到两个力的作用:
在这里插入图片描述

  1. 其他结点的库伦力(斥力)

f a ( d ) = d 2 k f_{a}(d)=\frac{d^{2}}{k} fa(d)=kd2

  1. 边对点的胡克力(引力)。

f r ( d ) = − k 2 d f_{r}(d)=\frac{-k^{2}}{d} fr(d)=dk2
该算法遵循两个简单的原则:有边连接的节点应该互相靠近;节点间不能离得太近。FR算法建立在粒子物理理论的基础上,将图中的节点模拟成原子,通过模拟原子间的力场来计算节点间的位置关系。算法通过考虑原子间引力和斥力的互相作用,计算得到节点的速度和加速度。依照类似原子或者行星的运动规律,系统最终进入一种动态平衡状态。

Python实现

输入的A是稀疏邻接矩阵,用scipy的coo_matrix生成,k是上述引斥力的系数,fiexed是固定不变的点的序号,返回结果是点的坐标。

import numpy as np
from scipy.sparse import coo_matrix


def sparse_fruchterman_reingold(A, k=None, pos=None, fixed=None, iterations=50, threshold=1e-5, dim=3):
    # np.random.seed(1)
    nodes_num = A.shape[0]
    A = A.tolil()
    A = A.astype('float')
    if pos is None:
        pos = np.asarray(np.random.rand(nodes_num, dim), dtype=A.dtype)
        print('Init pos', pos)
    else:
        pos = np.array(pos)
        pos = pos.astype(A.dtype)

    if fixed is None:
        fixed = []

    if k is None:
        k = np.sqrt(1.0 / nodes_num)
    t = max(max(pos.T[0]) - min(pos.T[0]), max(pos.T[1]) - min(pos.T[1])) * 0.1
    dt = t / float(iterations + 1)
    displacement = np.zeros((dim, nodes_num))
    for iteration in range(iterations):
        displacement *= 0
        for i in range(A.shape[0]):
            if i in fixed:
                continue
            delta = (pos[i] - pos).T
            distance = np.sqrt((delta ** 2).sum(axis=0))
            distance = np.where(distance < 0.01, 0.01, distance)
            Ai = np.asarray(A.getrowview(i).toarray())
            print('Ai', Ai)
            displacement[:, i] += \
                (delta * (k * k / distance ** 2 - Ai * distance / k)).sum(axis=1)
        # update positions
        length = np.sqrt((displacement ** 2).sum(axis=0))
        length = np.where(length < 0.01, 0.1, length)
        delta_pos = (displacement * t / length).T
        pos += delta_pos
        # cool temperature
        t -= dt
        err = np.linalg.norm(delta_pos) / nodes_num
        if err < threshold:
            break

    return pos


if __name__ == '__main__':

    row = np.array([0, 0, 1, 2, 3, 3])
    col = np.array([1, 3, 0, 3, 0, 2])
    data = np.array([1, 1, 1, 1, 1, 1])
    coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
    print(coo_matrix((data, (row, col)), shape=(4, 4)))
    a = sparse_fruchterman_reingold(coo_matrix((data, (row, col)), shape=(4, 4)))
    print(a)

其他算法可见:

https://www.omegaxyz.com/

参考

https://zhuanlan.zhihu.com/p/59977713
https://www.cnblogs.com/Dyleaf/p/8491136.html

更多内容访问 omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2020 • OmegaXYZ-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FR算法(Fruchterman-Reingold)Python实现 的相关文章

随机推荐

  • 简单区块链Python实现

    什么是区块链 区块链是一种数据结构 xff0c 也是一个分布式数据库 从技术上来看 xff1a 区块是一种记录交易的数据结构 xff0c 反映了一笔交易的资金流向 系统中已经达成的交易的区块连接在一起形成了一条主链 xff0c 所有参与计算
  • 复旦大学计算机保研夏令营

    Abstract 复旦的夏令营 xff1a 自由而无用 xff0c 一期招了200人入营 xff0c 不提供住宿 xff08 导致我租了个旅馆每天要骑单车来学校 xff0c 不过沿途环境不错 xff0c 有很多吃的地方 xff09 xff0
  • 计算机保研夏令营预推免

    夏令营与预推免个人情况 学校 xff1a 末流211 xff08 安徽大学 xff09 排名 xff1a 1 70绩点 xff1a 4 33 5 0竞赛 xff1a 无ACM xff0c 有某水赛国奖 xff08 中国人工智能学会主办 xf
  • 知识图谱嵌入的应用场景

    In KG应用 xff08 在 KG 范围内的应用 xff09 链接预测 xff08 Link prediction xff09 链接预测任务有时也称为实体预测或实体排序 xff0c 用来预测两个实体之间是否有特定的关系 即已知头实体h和关
  • Neo4j数据导入与可视化

    本文共1262个字 xff0c 预计阅读时间需要5分钟 简介 Neo4j是一个高性能的NoSQL图形数据库 xff0c 它将结构化数据存储在网络上而不是表中 它是一个嵌入式的 基于磁盘的 具备完全的事务特性的Java持久化引擎 xff0c
  • 用户身份链接方法——DeepLink

    论文 xff1a DeepLink A Deep Learning Approach for User Identity Linkage UIL xff08 User Identity Linkage xff09 xff1a 用户身份链接
  • 可视化图布局算法简介

    Fruchterman Reingold FR FR算法将所有的结点看做是电子 xff0c 每个结点收到两个力的作用 xff1a 其他结点的库伦力 xff08 斥力 xff09 f a d
  • Windows无法连接到打印机怎么办?快收藏这些正确做法!

    案例 xff1a Windows无法连接到打印机怎么办 xff1f 朋友们朋友们 xff0c 最近为了备考国考 xff0c 我特地买了个打印机回来打印资料 xff0c 但是我的Windows无法连接到打印机 xff0c 这是为什么呢 xff
  • Python爬虫Scrapy入门

    Scrapy组成 Scrapy是Python开发的一个快速 高层次的屏幕抓取和web抓取框架 xff0c 用于抓取web站点并从页面中提取结构化的数据 引擎 xff08 Scrapy xff09 xff1a 用来处理整个系统的数据流 xff
  • Mac下终端pip与pip3配置(软链接)

    缘起 今日Mac上的Python环境绝对是个asshole 系统自带一个Python2 7我官网下载一个3 6homebrew悄悄下了个3 xanaconda自带了一个3 x前天更新了一下Xcode命令行工具 xff0c 竟然给我偷偷下了个
  • 推荐系统摘要

    作为一个推荐系统的门外汉 xff0c 或者说是用户 xff0c 我觉得推荐系统有以下几个特性 推荐系统的真实目的并不是做到让用户满意 xff0c 而是提高销售能力 xff0c 业务水平和收益 一个好的推荐系统并不是推荐用户最喜爱 想要的东西
  • 数据分析岗位面试必备

    业务逻辑 数据分析遵循一定的流程 xff0c 不仅可以保证数据分析每一个阶段的工作内容有章可循 xff0c 而且还可以让分析最终的结果更加准确 xff0c 更加有说服力 一般情况下 xff0c 数据分析分为以下几个步骤 xff1a 业务理解
  • 基于LDA的文本主题聚类Python实现

    LDA简介 LDA xff08 Latent Dirichlet Allocation xff09 是一种文档主题生成模型 xff0c 也称为一个三层贝叶斯概率模型 xff0c 包含词 主题和文档三层结构 所谓生成模型 xff0c 就是说
  • Neo4j-import导入CSV的数据

    本文共1215个字 xff0c 预计阅读时间需要4分钟 最近有个上亿个关系 节点的数据需要导入到Neo4j xff0c 有以下几个工具可以导入 xff1a Cypher CREATE 语句 xff0c 为每一条数据写一个CREATECyph
  • Ajax与jQuery异步加载数据

    本文共1096个字 xff0c 预计阅读时间需要4分钟 简介 一次性从服务器数据库中读取数据并传送到前端页面上是不现实的 xff0c 一方面会加重服务器的压力 xff0c 另一方面客户的带宽资源也会被占用 Ajax刚好可以解决数据异步加载的
  • 图注意力网络(GAT) TensorFlow解析

    论文 图注意力网络来自 Graph Attention Networks xff0c ICLR 2018 https arxiv org abs 1710 10903 注意力机制 代码 span class token keyword im
  • 知识图谱属性与关系区别

    本文共674个字 xff0c 预计阅读时间需要3分钟 知识图谱中属性和关系的区别主要是在于其面对的实体不同 实体关系分为两种 xff0c 一种是属性property xff0c 一种是关系relation 其最大区别在于 xff0c 属性所
  • 知识融合(实体对齐)笔记

    本文共1132个字 xff0c 预计阅读时间需要4分钟 知识融合 本体匹配 xff08 ontology matching xff09 侧重发现模式层等价或相似的类 属性或关系 xff0c 也成为本体映射 xff08 mapping xff
  • C/C++/Windows/VC/MFC/Unix/Linux编程书籍推荐

    C C 43 43 编程书籍 C Primer Plus C 43 43 Primer C 43 43 Primer Plus C和指针 C陷阱与缺陷 C专家编程 C 43 43 沉思录 C语言深度剖析 Effective C 43 43
  • FR算法(Fruchterman-Reingold)Python实现

    简介Fruchterman Reingold FR FR算法将所有的结点看做是电子 xff0c 每个结点收到两个力的作用 xff1a 其他结点的库伦力 xff08 斥力 xff09 f a d