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

文章目录

本文参照了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轮迭代,即可将其绘制在庞加莱圆盘上。

相关推荐
weixin_431600441 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·
讲温控就好了1 小时前
从医疗影像到能源存储——芯片冷却温控技术的跨行业赋能
人工智能·python·能源
DeepVisionary2 小时前
从 Qwen3.8-27B 把原生多模态、原生 FP8、桌面级 Agent 三件事一次集齐,看开源大模型的“工业化拐点“
python·自动化
固定资产管理系统软件3 小时前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
TheBestRucy4 小时前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
lancyu4 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗4 小时前
Claude 使用指南
开发语言·python
工具分享5 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI5 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt