跳到内容

killianfmeehan/topological_node2vec

文件夹和文件

姓名姓名
上次提交消息
上次提交日期

最新提交

 
 
 
 
 
 
 
 
 

拓扑节点2vec

这是对节点2vec包含拓扑信息的机器学习框架,详见纸张.

由于此代码涉及持久性图的计算,如果没有通常使用GPU的专用包,计算可能会有点繁重。即使如此,在小示例中,此代码只能在CPU上运行。目前,GPU使用Ripser++包的修改,而CPU使用叫做古迪辛.

包装要求:

  • numpy公司
  • 熊猫
  • 马特普洛特利布
  • 操作系统
  • 松软的
  • 时间
  • sklearn公司
  • 我们的Ripser++叉子或Gudhi之一
  • 均质UROT
  • jupyter(并非严格必要,但此代码的设计考虑了笔记本操作)

在Mac和Linux上进行了测试。

安装

很抱歉没有说明,在我的精确系统上成功地使用GPU设置CUDA是我仅有的几次成功。如果您可以在Ripser++分叉运行时获得这样的设置,或者您只想在CPU上测试它,那么剩下的就是:

  • 安装上述其他必需的软件包
  • 将homogeusUROT包中的utils.py放在与此存储库的tn2v.py相同的文件夹中
  • 请参阅笔记本tn2v_examples.ipynb,了解如何利用tn2v的主要功能,并根据您的需要修改这些示例中的数据输入和超参数

*在未来的更新中,我想调整代码以从外部接收任意的持久同源计算函数,允许用户指定系统上安装的任何包/函数的使用。

使用

由于操作此代码所需的大量超参数调整以及输入参数的不同数据类型,我将此代码设计为在笔记本中最自然地使用。

注意:请注意,此代码功能正常,但正在进行中。如果您有兴趣使用它,并且有任何问题或遇到错误/崩溃,请联系我。

超参数

这个代码有很多超参数,其中大多数已经在我们的一些实验中被证明是重要的。这是对用户进行简要总结的尝试。或者(或一致),请参阅附带的tn2v_examples.ipynb笔记本,它重复了我们论文中的示例。


伦恩:纪元数/学习过程的长度。


eta数组:步长数组;在应用之前,所有渐变更新都会乘以相应的eta。

eta_阵列 = 净现值.林斯空间(0.005,0.001,伦恩+1)

开头的较高值可以快速移动点/创建必要的特征,但结尾的较低值可以锐化嵌入的精细细节。


λ*:node2vec损失函数上的标量乘数与拓扑损失函数

λ0 = 1
λ1 = 256
λ2 = 768

L0_阵列 =[λ0 对于  在里面 范围(伦恩+1)]L1_阵列 =[λ1 对于  在里面 范围(伦恩+1)]L2_阵列 =[λ2 对于  在里面 范围(伦恩+1)]

L0对应于node2vec损失函数;L1对应于维度1的拓扑损失(周长和圆盘);L2对应于维度2(曲面和球体)的拓扑损失。对于给定的历元,任何设置为0(或根本没有设置)的值都不会被测量/应用。


主目录:所有输出都将保存在此文件夹的子文件夹中

主目录 = +'/tn2v_output/'

data_*,倒数γ,倒数nu:必须至少指定[data_pointcloud,data_distance_matrix,data_correlation_matrix]中的一个。如果未提供,将从其他给定数据自动生成data_distance_matrix或data_correlation_matrix。具体来说,距离/相关矩阵之间的转换由值reciprocal_gamma和reciprocar_nu给出(参见第4节开头的文章)。

数据点云 = .数据帧
数据距离矩阵 = 
数据相关性矩阵 = 

往复γ = 0.001
倒数nu = 1

l、 r、p、q:这些是Node2vec邻域生成参数(参见中的第2节报纸)

第页 = 8
 = 1
L_阵列 =[ 对于  在里面 范围(伦恩+1)]数组(_A) =[第页 对于  在里面 范围(伦恩+1)]数组(_A) =[0 对于  在里面 范围(伦恩+1)]数组(_A) =[1 对于  在里面 范围(伦恩+1)]

在r*l>输入数据大小的特殊情况下,不采样邻域。相反,直接距离矩阵列向量被反转、规范化并用作概率向量。(见论文备注1。)


nbhd_regen公司:此值指示网络对用作训练数据的每个点周围的随机邻域进行重新采样的频率。值n表示邻域将在每n个纪元重新生成。如果邻域不是随机生成的,则忽略此值,如上所述。

nbhd_regen公司 = 1 #任意正整数或无

住房抵押贷款证券:整数值,声明每个历元要小批量处理的点数。目前,微型批处理仅用于拓扑损失函数,而node2vec损失函数始终在每个历元的完整数据集上运行。我计划更新此代码,使其能够输入双数组的minibatches,但在我对node2vec损失函数进行测试时,minibatchs大大降低了嵌入质量。

mbs数组 =[整数(数据.形状[0]*1)对于  在里面 范围(伦恩+1)]

举起:这是我们在分析了拓扑损失函数在简单嵌入上的初始较差性能后添加的一个重要超参数。这是一个浮动,它缩小了目标持久性图的总直径(输入的PD),这意味着不需要lift值>1.0。简单地说,这会导致拓扑损失函数作用于两个PD的平移(升力),这两个PD通过升力*diam(目标PD)直接偏离对角线。事实证明,这对于原始Node2vec彻底擦除拓扑的嵌入非常重要,以至于大多数生成器都匹配对角线而不是彼此匹配。

lift_array(提升_阵列) =[0 对于  在里面 范围(伦恩+1)]

关于

包含拓扑信息的图表示学习模型

资源

许可证

星星

观察者

叉子

发布

未发布任何版本

包装

未发布包