度量张量、高斯随机变量相关系数都可以用椭圆来进行可视化,下面讲一下两者的本质和联系,以及绘制椭圆可视化过程中的常见问题。都以二维平面的椭圆为例。
度量张量
又叫黎曼度量,物理学译为度规张量,是指一用来衡量度量空间中距离,面积及角度的二阶张量。
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 θ^=θ+kπ,对椭圆而言旋转 π \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()
490

被折叠的 条评论
为什么被折叠?



