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