在不同空间中展示数据(欧式、球面、庞加莱圆盘)

文章目录

本文参照了Geomstats的官方教程,对不同流形上的数据进行了展示。

欧式空间

我们平时接触最多的就是欧式空间,在geomstats中,可创建一个Euclidean对其实现。下面创建一个欧氏空间,并计算其上两个随机点的平均值,效果如下,没什么好说的,初中几何。

python 复制代码
import geomstats.backend as gs
gs.random.seed(2020)
from geomstats.geometry.euclidean import Euclidean

euclidean = Euclidean(dim=2, equip=False)
ptsLS = euclidean.random_point(n_samples=2)

avg = gs.sum(ptsLS, axis=0) / 2

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'Times New Roman'

ax = plt.subplot()
ax.scatter(ptsLS[:, 0], ptsLS[:, 1], label="Points")
ax.plot(ptsLS[:, 0], ptsLS[:, 1], linestyle="dashed")

ax.scatter(gs.to_numpy(avg[0]), gs.to_numpy(avg[1]),
    label="Mean", s=80, alpha=0.5)

ax.set_title("Mean of points in a linear space")
ax.legend()
plt.show()

超球面

同样是求平均值的问题,如果挪用到超球面上,那么问题可能会发生变化。按照欧式空间的做法,球面上任意两点,其平均值一定不在球面上,为了让平均值操作在球面上仍然有意义,就需要在测地线上取平均值。

在geomstats中,通过实现【Hypersphere】对象,即可创建一个超球面,最终求得平均值如下

python 复制代码
from geomstats.geometry.hypersphere import Hypersphere

sphere = Hypersphere(dim=2, equip=False)
ptsHyper = sphere.random_point(n_samples=2)
avg = gs.sum(ptsHyper, axis=0) / 2

import geomstats.visualization as visualization

ax = plt.subplot(projection="3d")
visualization.plot(ptsHyper, ax=ax, space="S2", label="Point", s=80)

ax.plot(ptsHyper[:, 0], ptsHyper[:, 1], ptsHyper[:, 2],
    linestyle="dashed", alpha=0.5)

ax.scatter(avg[0], avg[1], avg[2], label="Mean", s=80, alpha=0.5)

ax.set_title("Mean of points on a manifold")
ax.legend()
plt.show()

绘图代码中,S2表示三维球面。

双曲空间

karate_graph数据集是一组关于社交关系的网络,常被用于图上聚类的研究。下面调用这组数据集,并在庞加莱圆盘上展示这组数据,效果如下

在庞加莱圆盘中,圆盘中心处图形的大小看起来是正常的,但越靠近圆盘的边缘,图形在视觉上就变得越小,而圆盘的圆周则直接表示无穷远。如果将上图画在欧式空间中,外围的点间距离会迅速变大,影响读图。

代码如下

python 复制代码
import geomstats.datasets.utils as data_utils
karate_graph = data_utils.load_karate_graph()
from geomstats.datasets.prepare_graph_data import HyperbolicEmbedding

hyperbolic_embedding = HyperbolicEmbedding(max_epochs=20)
embeddings = hyperbolic_embedding.embed(karate_graph)
disk = visualization.PoincareDisk(coords_type="ball")
ax = plt.subplot()
disk.set_ax(ax)
disk.draw(ax=ax)
ax.scatter(embeddings[:, 0], embeddings[:, 1])
plt.show()

【HyperbolicEmbedding】是用于计算庞加莱嵌入的类,随后调用【embed】方法,将karate_graph数据嵌入到双曲空间中,经过20轮迭代,即可将其绘制在庞加莱圆盘上。

相关推荐
高洁0112 分钟前
数据同化与动态状态估计:让孪生持续贴合现实
人工智能·python·深度学习·transformer·迁移学习
通信仿真爱好者38 分钟前
第【139】期--基于深度学习的OFDM信道估计方法研究--python完整代码
python·深度学习·ofdm·信道估计
威哥爱编程42 分钟前
模拟面试智能体开发实战 07:答完一题就点评一题,结构化输出给分建议,让每道题都变成复盘
python·agent·harmonyos
cpolar技术支持1 小时前
中文文件名排序跟拼音对不上:os.listdir 返回的是文件系统顺序,三个中文名按字节排结果正好相反
python·文件系统·cpolar·编码·排序
Thanks_ks1 小时前
【第 008 讲】在终端中运行 Python 程序:交互模式与脚本模式 | 绝对路径与相对路径 | 以模块方式运行 | 常见报错的识别与排查
python·异常处理·终端·脚本·命令行·cmd·python 解释器
威哥爱编程1 小时前
模拟面试智能体开发实战 08:总评报告先过三道闸,防泄题防夸大防错建议,才敢发到候选人手上
python·agent·harmonyos
郝学胜-神的一滴1 小时前
LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
开发语言·python·langchain·numpy
投图匠12 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_9679801113 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab13 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估