从度量张量、相关系数生成椭圆参数

度量张量、高斯随机变量相关系数都可以用椭圆来进行可视化,下面讲一下两者的本质和联系,以及绘制椭圆可视化过程中的常见问题。都以二维平面的椭圆为例。

度量张量

又叫黎曼度量,物理学译为度规张量,是指一用来衡量度量空间中距离,面积及角度的二阶张量。 x i x_i xi为欧几里得空间中一点的坐标,在其构成的局部坐标系统中,对 x i x_i xi附近(切空间)的的点有 x = x i + d x x=x_i+dx x=xi+dx,度量张量可记为 G ( x i ) G(x_i) G(xi),满足
d s 2 = d x T G ( x i ) d x ds^2 = dx^T G(x_i )dx ds2=dxTG(xi)dx 如果对这个度量张量进行可视化,可以用 d x T G ( x i ) d x = 1 dx^T G(x_i) dx = 1 dxTG(xi)dx=1的椭圆来绘制。
在这里插入图片描述

一个典型的黎曼空间中度量张量的椭圆可视化,其中不同位置的张量有显著差别
图1. 两个典型的黎曼空间中度量张量的椭圆可视化,其中不同位置的张量有显著差别 地球图片源自[1]

相关系数

对于多维高斯随机变量 X = ( X 1 , X 2 , . . . , X n ) X=(X_1, X_2, ..., X_n) X=(X1,X2,...,Xn),其概率密度函数是
p ( X ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 exp ⁡ { − 1 2 ( X − μ ) T Σ − 1 ( X − μ ) } p(X) = \frac{1}{{(2\pi)}^{\frac{n}{2}}\left| \Sigma\right|^{\frac{1}{2}} }\exp\{-\frac{1}{2}(X-\mu)^T\Sigma^{-1}(X-\mu)\} p(X)=(2π)2nΣ211exp{21(Xμ)TΣ1(Xμ)}
该分布的图像包含多个同心椭圆构成的等值面,选取其中的一个椭圆进行绘制,就是要绘制 ( X − μ ) T Σ − 1 ( X − μ ) = 1 (X-\mu)^T\Sigma^{-1}(X-\mu) = 1 (Xμ)TΣ1(Xμ)=1
必须知道其中的相关系数矩阵 Σ \Sigma Σ,才能画出椭圆。

二维高斯分布概率密度函数可视化
图2. 二维高斯分布概率密度函数可视化

二者的区别和联系:度量张量是几何概念,高斯分布的相关系数是统计概念。对于一个含有随机变量的系统而言,如果其观测结果是非均匀的,观测空间可以是一个概率分布描述的空间,也可以是一个度量张量刻画的几何流形对应空间。具体的例子如机器学习特征的高维流形、人的色彩感知平面等。注意 G = Σ − 1 G=\Sigma^{-1} G=Σ1,具有对称性。

椭圆参数

通常用方程 x T G x = 1 x^TGx=1 xTGx=1表示一个椭圆,所以G中就包含了全部所需参数。然而,很多画椭圆函数(例如python中plt.patch.Ellipse)提供的参数是长轴长、短轴长和逆时针长轴旋转角度。如何从 G G G解析这些参数是一个关键问题。
示意椭圆

考虑二维平面上的椭圆,有长半轴长度 a a a,短半轴长度 b b b,逆时针逆时针长轴旋转角度 θ \theta θ. 对于 θ = 0 \theta = 0 θ=0的普通椭圆,容易写出
x 2 a 2 + y 2 b 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2}=1 a2x2+b2y2=1
对应的 G G G就是:
[ 1 a 2 0 0 1 b 2 ] \begin{bmatrix} \frac{1}{a^2} & 0 \\ 0 & \frac{1}{b^2} \end{bmatrix} [a2100b21]
可以直接从对角阵元素计算得到长短轴半轴长度。

然而,当旋转角度不为0时,我们考虑当前椭圆是由普通椭圆旋转而来的,旋转前的椭圆上某点坐标记为 Y Y Y,有
Y = Q T X Y=Q^TX Y=QTX
其中 Q T Q^T QT
[ cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ] \begin{bmatrix} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{bmatrix} [cosθsinθsinθcosθ]

Y Y Y满足椭圆方程 Y T U Y = 1 Y^T U Y=1 YTUY=1 U = d i a g ( 1 a 2 , 1 b 2 ) U=diag(\frac{1}{a^2},\frac{1}{b^2}) U=diag(a21,b21)
进一步有 X T Q U Q T X = 1 X^TQUQ^TX=1 XTQUQTX=1,所以可以得到 G = Q U Q T G=QUQ^T G=QUQT. 对称矩阵 G G G分解得到这种形式,只需要做正交对角化就可以了(或调用SVD分解的函数)。最后,根据分解出的 U U U a , b a,b a,b,根据 Q Q Q θ \theta θ.

但是,这里有个坑,分解出的矩阵 Q Q Q只保证了列向量的是特征向量、满足正交性。这样的向量有两种可能解: ( cos ⁡ θ , sin ⁡ θ ) (\cos \theta, \sin \theta) (cosθ,sinθ) ( − cos ⁡ θ , − sin ⁡ θ ) (-\cos \theta, -\sin \theta) (cosθ,sinθ)。所以,求解 θ \theta θ应该用 a r c t a n ( q 12 q 11 ) arctan( \frac{q_{12}}{q_{11}}) arctan(q11q12),解出的 θ ^ = θ + k π \hat{\theta}=\theta+k\pi θ^=θ+,对椭圆而言旋转 π \pi π没有任何变化。

代码举例:从相关系数给出椭圆参数,可直接用于plt画椭圆

import numpy as np 
import matplotlib.pyplot as plt
import matplotlib.patches as patches

def sigma_to_abtheta(mat22):
    U,Sigma,V = np.linalg.svd(mat22,full_matrices=True)
    a = np.sqrt(Sigma[0])
    b = np.sqrt(Sigma[1])
    theta = np.arctan(U[0,1]/U[0,0]) # U = QT, row is feature vector
    return a,b,theta

mat22 = np.array([[ 0.00287626 -0.00084234]
 [-0.00084234  0.00604468]])
a,b,theta = sigma_to_abtheta(mat22)
ellipse_1 = patches.Ellipse((0.5,0.5),
                                 width=2*a, height=2*b, 
                                 facecolor='#00FF00', angle=theta/np.pi*180., 
                                 edgecolor='#00FF00', linewidth=1, fill=False)
fig,ax = plt.subplots()
ax.add_patch(ellipse_1)
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值