FR算法(Fruchterman-Reingold)Python实现
简介Fruchterman Reingold (FR)
FR算法将所有的结点看做是电子,每个结点收到两个力的作用:
- 其他结点的库伦力(斥力)
fa(d)=d2kf_{a}(d)=\frac{d^{2}}{k}fa(d)=kd2
- 边对点的胡克力(引力)。
fr(d)=−k2df_{r}(d)=\frac{-k^{2}}{d}fr(d)=d−k2
该算法遵循两个简单的原则:有边连接的节点应该互相靠近;节点间不能离得太近。FR算法建立在粒子物理理论的基础上,将图中的节点模拟成原子,通过模拟原子间的力场来计算节点间的位置关系。算法通过考虑原子间引力和斥力的互相作用,计算得到节点的速度和加速度。依照类似原子或者行星的运动规律,系统最终进入一种动态平衡状态。
Python实现
输入的A是稀疏邻接矩阵,用scipy的coo_matrix生成,k是上述引斥力的系数,fiexed是固定不变的点的序号,返回结果是点的坐标。
import numpy as np
from scipy.sparse import coo_matrixdef 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.1dt = t / float(iterations + 1)displacement = np.zeros((dim, nodes_num))for iteration in range(iterations):displacement *= 0for i in range(A.shape[0]):if i in fixed:continuedelta = (pos[i] - pos).Tdistance = 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 positionslength = np.sqrt((displacement ** 2).sum(axis=0))length = np.where(length < 0.01, 0.1, length)delta_pos = (displacement * t / length).Tpos += delta_pos# cool temperaturet -= dterr = np.linalg.norm(delta_pos) / nodes_numif err < threshold:breakreturn posif __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-版权所有 转载请注明出处
FR算法(Fruchterman-Reingold)Python实现相关推荐
- C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等
C4.5决策树生成算法完整版(Python) 转载请注明出处:©️ Sylvan Ding ID3算法实验 决策树从一组无次序.无规则的事例中推理出决策树表示的分类规则,采用自顶向下的递归方式,在决策 ...
- LeetCode 148. Sort List--面试算法题--C++,Python解法
LeetCode 148. Sort List–面试算法题–C++,Python解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大 ...
- 手把手教你EMD算法原理与Python实现(更新)
Rose今天主要介绍一下EMD算法原理与Python实现.关于EMD算法之前介绍过<EMD算法之Hilbert-Huang Transform原理详解和案例分析>, SSVEP信号中含有自 ...
- 数学建模——主成分分析算法详解Python代码
数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...
- python数据挖掘 百度云,常用数据挖掘算法总结及Python实现高清完整版PDF_python数据挖掘,python数据分析常用算法...
常用数据挖掘算法总结及Python实现 高清完整版PDF 第一部分数据挖掘与机器学习数学基础 第一章机器学习的统计基础 1.1概率论 l概率论基本概念 样本空间 我们将随机实验E的一切可能基本结果组成 ...
- python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现
第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...
- 【代码刷题】排序算法总结(python实现)
排序算法总结(Python实现) 算法介绍 算法分类 相关概念 1. 冒泡排序(Bubble Sort) 1.1 思想 1.2 python实现 1.3 复杂度 1.4 稳定性 2. 快速排序(Qui ...
- c4.5算法python实现_算法:用Python实现—最优化算法
今天给大家分享一下算法,用python来实现最优化算法.废话不多说,直接上代码: 一.二分法 函数详见rres,此代码使该算法运行了两次 def asdf(x): rres=8*x**3-2*x**2 ...
- 经典排序算法总结与Python实现(下)
在之前的博客经典排序算法总结与Python实现(上)中已经讨论过插入.冒泡.选择.快排.谢尔排序.这篇博客主要完成剩下的几个排序算法. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平 ...
- 经典排序算法总结与Python实现(上)
本篇博客中的有序都是指的升序,降序情况稍微改改就出来了. 排序算法 时间复杂度(最好) 时间复杂度(最差) 时间复杂度(平均) 空间复杂度 稳定性 插入排序 O(n)O(n)O(n) O(n2)O(n ...
最新文章
- Coolite 中GridView行按钮取行ID并调用服务器端代码
- ModuleNotFoundError: No module named 'CommandNotFound'
- Ubuntu下安装JDK1.8并配置开发环境
- 【opencv】实时人脸+眼睛+微笑检测
- 跟谁学上市未满1年遭4家机构6轮做空,市值一周缩水近20亿美元
- 愚人节谁最皮?华为宣布攻克兽语,小米6复刻版官宣,微信发万元红包...
- OpenShift 4 - Fedora CoreOS (5) - CoreOS的常规操作
- Asp.net SignalR
- Android异常总结---ActivityManager: Warning: Activity not started,its current task has been brought to th
- 浅谈vue —— 生命周期
- vs 配置 .pdb
- 常用Gis通用符号库大全
- ios视频播放器封装(全屏播放,锁屏、手势调节亮度、音量、进度)
- jaspersoft studio6.x 设计医院检查报告单样式
- windows10如何设置电脑的固定IP地址
- ffmpeg 裁剪视频 / 批量
- kubernetes pod 挂载 ceph rbd
- 我是CSDN最硬核作者,谁赞成,谁反对?
- 三种设计满足需求 网吧网络解决方案(转)
- MT4MT5EA编程跟单系统EA
热门文章
- 一个基于protobuf的极简RPC
- linux需要4k对齐么,linux查看硬盘4K对齐方法
- 通过系统架构设计师考试的一点经验(2019年软考)+学习资料下载
- crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫
- 使用FileOutputStream和ObjectOutputStream向文本文件中写多个对象的信息(序列化)
- boost::asio c++ 网络编程socket通信一个简单例子
- ORB-SLAM3 一张图梳理mono_kitti.cc主流程
- caffe 绘制accuracy和loss曲线
- JOptionPane总结
- 关于线程协同的火车票售卖程序