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

文章目录

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

相关推荐
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy6 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12037 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami7 小时前
【无标题】
开发语言·python
CodeGL7 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer8 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_967980119 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
Patrick在香港10 小时前
台风在变少,来香港的没有
python·数据分析·香港·开放数据·热带气旋
qq_4069810310 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
benchmark_cc10 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash