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

文章目录

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

相关推荐
2601_962078191 小时前
Python中calendar.weekday用法
python·编程技巧·calendar·日期处理·weekday
2601_962218611 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
2601_966949651 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
2601_962885721 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
李高钢2 小时前
Python FastAPI 框架入门:从零搭建你的第一个高性能 API 服务
数据库·python·fastapi
ocean21032 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
Warson_L3 小时前
Python的OrderedDict
python
隐擎fox3 小时前
高性能网络爬虫架构设计:基于 Python 的长连接复用与分布式会话池调度实践
分布式·python·网络协议·tcp/ip·高并发·网络爬虫、
Warson_L3 小时前
Python的TypedDict
python·langchain·llm
晓窗科技4 小时前
口碑好的AI基座服务商
大数据·人工智能·python